Відповіді:
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
виклик призвів до синтаксичної помилки, але в ньому було вказано лише перший сертифікат у групі. По-друге, два виклики функціонально однакові. По-третє, і, мабуть, найголовніше, і для вас не працює, принаймні для мене; він також містить лише перший сертифікат у комплекті.