Відповіді:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 пропонує такий однострочний:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
Це дійсно працювало для мене, але я не розумію деталей, тому не можу сказати, чи є якісь застереження.
/etc/ssl/certs/ca-certificates.crtі отримавunable to load PKCS7 object
Java keytoolвиконує фокус:
keytool -printcert -v -file <certs.crt>
Анотація: подвійний клацання Windows не працює. Windows зчитує лише перший сертифікат у сховищі ключів і автоматично розширює ланцюжок довіри зі свого вбудованого магазину сертифікатів.
Результати:
.crtфайлі, не відображаються.crtфайлі. Це може призвести до неправильних висновків.Після цього FAQ мене привів до цього сценарію perl , який дуже наполегливо підказує мені, що opensslнемає вродженої підтримки для обробки n- го сертифіката в пакеті, і що замість цього ми повинні використовувати якийсь інструмент для нарізання та нарізання кубиків перед подачею кожного сертифікат на 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. Друга команда прокручує через витягнуті серти і показує їх.
Невеликі зміни до повідомлення MadHatter, щоб ви могли скопіювати / вставити прямо в CLI. Я також включив хеш MD5, який корисний при перевірці правильності сертифікатів. Рядок stdin, що повертається, - хеш md5 cert (s).
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
На всякий випадок, якщо ваша версія opensl не підтримує всі ці прапори, тут ви можете скористатися деревом. Те саме, що і перше, але просто труба для виїдання.
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
Ось базове рішення, яке не покладається на проміжні файли.
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-блоки із stdin та об'єднуючи кожен блок в одну кодовану рядок base64. Потім рядки читаються, розшифровуються і передаються до openssl як сертифіковані DER сертифікати.
cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'.
Я хотів би сюди ввести ідіоматичний командний рядок 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-й сертифікат.
Один із способів побачити весь ланцюг - це (звичайно в Windows), щоб двічі клацнути на crt, а потім переглянути на вкладці Шлях сертифікації. Він покаже весь ланцюжок, навіть якщо є лише Проміжний, або Root Cert. Деталі див. На скріншоті нижче. Якщо ви не в Windows, вибачаюся за мою незнання варіантів Unix / Linux.
Примітка: це може призвести до помилкових результатів, якщо проміжний сертифікат знаходиться у вашій локальній магазині ключів, Windows додасть його автоматично, а не покаже лише те, що було в комплекті.
Я не помітив вашу початкову команду, і у вас є одне на місці. Ваша команда повинна виглядати так:
openssl x509 -in bundle.crt -noout -text
Джерело: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
opensslвиклик призвів до синтаксичної помилки, але в ньому було вказано лише перший сертифікат у групі. По-друге, два виклики функціонально однакові. По-третє, і, мабуть, найголовніше, і для вас не працює, принаймні для мене; він також містить лише перший сертифікат у комплекті.