Перечислите весь доступный ssl приблизительно сертификаты

Я предпочитаю csplit опцией, но как альтернатива здесь является GNU awk решение:

parse.awk

BEGIN { 
  RS="\\[ entry[0-9]+ \\]\n"  # Record separator
  ORS=""                      # Reduce whitespace on output
}
NR == 1 { f=RT }              # Entries are of-by-one relative to matched RS
NR  > 1 {
  split(f, a, " ")            # Assuming entries do not have spaces 
  print f  > a[2] ".txt"      # a[2] now holds the bare entry name
  print   >> a[2] ".txt"
  f = RT                      # Remember next entry name
}

Выполните его как это:

gawk -f parse.awk entry.txt

38
23.10.2013, 17:33
5 ответов

Это не ключи SSL, которые Вы хотите, это - центры сертификации и более точно их сертификаты.

Вы могли попробовать:

awk -v cmd='openssl x509 -noout -subject' '
    /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt

Получить "предмет" каждого сертификата CA в /etc/ssl/certs/ca-certificates.crt

Остерегайтесь этого иногда, Вы получаете ту ошибку, когда серверы SSL забывают предоставлять промежуточные сертификаты.

Использовать openssl s_client -showcerts -connect the-git-server:443 получить список отправляемых сертификатов.

68
27.01.2020, 19:35

Не уверенный в хинду, но большинстве дистрибутивов помещает их гибкую ссылку сертификатов в местоположение в масштабе всей системы в /etc/ssl/certs.

  • Файлы ключей входят /etc/ssl/private
  • Обеспеченные системой фактические файлы расположены в /usr/share/ca-certificates
  • Пользовательские сертификаты входят /usr/local/share/ca-certificates

Каждый раз, когда Вы помещаете сертификат в один из вышеупомянутых путей, выполненных update-ca-certificates обновить /etc/ssl/certs списки.

15
27.01.2020, 19:35
  • 1
    /etc/ssl/certs корректная папка в хинду. Но файлы не должны хорошо читать для человеческих глаз. команда –  Jonas Stein 23.10.2013, 18:09
  • 2
    Это update-ca-certificates с дополнительным s (не может отредактировать это самостоятельно, поскольку это - просто редактирование с одним символом). формат –  Slaven Rezic 17.07.2017, 16:01

У меня было требование перечислить все сертификаты на нашем сервере и уведомить, если срок их действия истекает. Мы придумали эту команду:

locate.pem | grep "\.pem$" | xargs -I{} openssl x509 -issuer -enddate -noout -in {}
5
27.01.2020, 19:35

Поиск с помощью crt или ключевых файлов также работает

find / -type f -name *.key
find / -type f -name *.crt 
-1
22.09.2020, 04:34

openssl и чистый способ bash

Даже если ответ Stéphane Chazelas работает нормально и эффективно, я хотел бы опубликовать этот скрипт , который даст почти такой же результат, но не используйтеawk:

#!/bin/bash
exec {sslout}<> <(:)
cnt=1
while read -u $certs line; do
    [ "$line" ] && case $line in 
        *BEGIN*)
            exec {ssl}> >(openssl x509 -noout -subject >&${sslout})
            echo $line 1>&$ssl
        ;;
        *END*)
            echo $line 1>&$ssl
            exec {ssl}>&-
            read -u $sslout subject
            printf "%03d  %s\n" $((cnt++)) "${subject#subject=}"
        ;;
        *)
            echo $line 1>&$ssl
        ;;
    esac;
done {certs}< /etc/ssl/certs/ca-certificates.crt
exec {certs}>&- {sslout}>&-

Еще один шаг

Поиск сертификатов во всех каталогах, упомянутых в ответе SHW , сортировка по хэшам и количеству

#!/bin/bash

exec {sslout}<> <(:)
cnt=0
hashed=()
while read -u $certs line; do
    [ "$line" ] && case $line in 
        *BEGIN*)
            exec {ssl}> >(openssl x509 -noout -hash -subject >&${sslout})
            echo $line 1>&$ssl
        ;;
        *END*)
            echo $line 1>&$ssl
            exec {ssl}>&-
            read -u $sslout hash
            read -u $sslout subject
            ((cnt++))
        hashed[16#$hash]+="${subject#subject=}"$'\t'
        ;;
        *)
            echo $line 1>&$ssl
        ;;
    esac
done {certs}< <(find /etc/ssl/certs /usr/{local/,}share/ca-certificates \
                    -type f -exec cat {} +)
exec {certs}>&- {sslout}>&-
echo "$cnt certs read, ${#hashed[@]} different hashes."
for i in ${!hashed[@]};do
    IFS=$'\t' read -a subj <<<"${hashed[i]}"
    printf "%8x  %s\n" $i "$subj"
    ((${#subj}>1)) && printf "          %s\n" "${subj[@]:1}"
done

может выводить что-то вроде:

    256 certs read, 128 different hashes.
 3179a64  C = NL, O = Staat der Nederlanden, CN = Staat der Nederlanden EV Root CA
          C = NL, O = Staat der Nederlanden, CN = Staat der Nederlanden EV Root CA
 62cdee6  OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
          OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
 64e0aa9  C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 G3
          C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 G3
...
0
14.10.2020, 14:17

Теги

Похожие вопросы