Я предпочитаю 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
Это не ключи 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
получить список отправляемых сертификатов.
Не уверенный в хинду, но большинстве дистрибутивов помещает их гибкую ссылку сертификатов в местоположение в масштабе всей системы в /etc/ssl/certs
.
/etc/ssl/private
/usr/share/ca-certificates
/usr/local/share/ca-certificates
Каждый раз, когда Вы помещаете сертификат в один из вышеупомянутых путей, выполненных update-ca-certificates
обновить /etc/ssl/certs
списки.
/etc/ssl/certs
корректная папка в хинду. Но файлы не должны хорошо читать для человеческих глаз. команда
– Jonas Stein
23.10.2013, 18:09
update-ca-certificates
с дополнительным s
(не может отредактировать это самостоятельно, поскольку это - просто редактирование с одним символом). формат
– Slaven Rezic
17.07.2017, 16:01
У меня было требование перечислить все сертификаты на нашем сервере и уведомить, если срок их действия истекает. Мы придумали эту команду:
locate.pem | grep "\.pem$" | xargs -I{} openssl x509 -issuer -enddate -noout -in {}
Поиск с помощью crt или ключевых файлов также работает
find / -type f -name *.key
find / -type f -name *.crt
Даже если ответ Stéphane Chazelas работает нормально и эффективно, я хотел бы опубликовать этот скрипт bash , который даст почти такой же результат, но не используйте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
...