У меня есть пакет сертификатов .crt файл.
делать openssl x509 -in bundle.crt -text -noout
показывает только корневой сертификат.
как мне увидеть все остальные сертификаты?
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 предлагает этот однострочный:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
Это действительно сработало для меня, но я не понимаю деталей, поэтому не могу сказать, есть ли какие-либо оговорки.
Java keytool
делает трюк:
keytool -printcert -v -file <certs.crt>
Аннотация: Двойной щелчок Windows не работает. Windows считывает только первый сертификат в хранилище ключей и автоматически расширяет цепочку доверия из своего встроенного хранилища сертификатов.
Полученные результаты:
.crt
файл не отображается.crt
файл. Это может привести к неправильным выводам.Следующий этот FAQ привел меня к этот скрипт Perl, что очень убедительно подсказывает мне, что openssl
не имеет встроенной поддержки для обработки пth сертификат в пакете, и вместо этого мы должны использовать какой-то инструмент для нарезки входных данных перед передачей каждого сертификата в openssl
. Этот сценарий Perl, свободно адаптированный из сценария Ника Берча, ссылка на который приведена выше, похоже, выполняет свою работу:
#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1 Nick Burch <nick@tirian.magd.ox.ac.uk>
# v0.0.2 Tom Yates <tyates@gatekeeper.ltd.uk>
#
$filename = shift;
unless($filename) {
die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");
$thisfile = "";
while(<INP>) {
$thisfile .= $_;
if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
print "Found a complete certificate:\n";
print `echo \'$thisfile\' | openssl x509 -noout -text`;
$thisfile = "";
}
}
close INP;
Oneliner, который отображает сводку по каждому сертификату в файле.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(аналогичный коммандос, упомянутый в другом ответе, но это дает более короткий вывод без параметра --text).
пример:
$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout
subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo
Это может быть некрасиво или элегантно, но это было быстро и сработало для меня, используя bash в Linux и блоки в формате PEM в файле пакета ca-cert.
while read line
do
if [ "${line//END}" != "$line" ]; then
txt="$txt$line\n"
printf -- "$txt" | openssl x509 -subject -issuer -noout
txt=""
else
txt="$txt$line\n"
fi
done < /path/to/bundle/file
Вы можете поместить все это в одну строку и настроить параметры openssl по своему усмотрению. Я действительно хотел бы, чтобы для этого было более элегантное решение, но в данном случае я думаю, что поиск более элегантного решения занял бы больше времени, чем взлом неэлегантного.
Поскольку нет решения на основе awk:
$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done
Первая команда разбивает пакет на сертификаты, ища строки BEGIN и END. Вторая команда просматривает извлеченные сертификаты и показывает их.
В bash обычно требуется только одна (длинная) строка кода :-)
tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete
Я хотел бы добавить сюда идиоматическую командную строку perl:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Если есть текст, то чуть более надежная настройка:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Просто измените значение n во втором выражении, чтобы получить n-й сертификат.
Небольшое изменение в сообщении MadHatter, позволяющее копировать / вставлять прямо в CLI. Я также включил хэш MD5, который помогает проверять правильность сертификатов. Возвращенная строка stdin - это хеш md5 сертификата (ов).
perl -e 'my $thisfile = "";
foreach (<>) {
$thisfile .= $_;
if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
print "Found a complete certificate:\n";
print `echo "$thisfile" | openssl x509 -noout -text`;
print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
$thisfile = "";
}
}' < my_id_cert_and_ca_bundle.crt
Если вы хотите получить красивый, краткий и сжатый вывод, используйте эту версию. Полезно, если вы только проверяете, что вы включили весь свой сертификат, но на самом деле не проверяете использование и т. Д. Сертификата (ов).
perl -e 'my $thisfile = "";
foreach (<>) {
$thisfile .= $_;
if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
print "Found a complete certificate:\n";
print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
$thisfile = "";
}
}' < my_id_cert_and_ca_bundle.crt
На всякий случай, если ваша версия openssl не поддерживает все эти флаги, вот несколько egrep, которые вы можете использовать. То же, что и первый, но только трубка в egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Чтобы проверить MD5-хэш закрытого ключа, вы можете сделать следующее.
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Вот решение на основе awk, которое не полагается на промежуточные файлы.
cat bundle.crt | awk '{
if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
else if ($0 == "-----END CERTIFICATE-----") print cert
else cert=cert$0
}' | while read CERT; do
echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done
Он работает, считывая блоки PEM со стандартного ввода и объединяя каждый блок в одну строку в кодировке base64. Затем строки читаются, декодируются и передаются в openssl как сертификаты в кодировке DER.
Один из способов увидеть всю цепочку (конечно, в Windows) - это дважды щелкнуть crt и затем просмотреть вкладку «Путь сертификации». Он покажет всю цепочку, даже если есть только промежуточный или корневой сертификат. Подробности смотрите на скриншоте ниже. Если вы не в Windows, прошу прощения за незнание вариантов Unix / Linux.
Примечание: это может привести к ложным результатам, если промежуточный сертификат находится в вашем локальном хранилище ключей. Windows добавит его автоматически, а не покажет только то, что было в комплекте.
Я упустил из виду вашу первоначальную команду, и у вас есть кое-что неуместное. Ваша команда должна выглядеть так:
openssl x509 -in bundle.crt -noout -text
Источник: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html