Як переглянути всі SSL сертифікати в комплекті?


101

У мене є пакет .crt сертифіката.

робити openssl x509 -in bundle.crt -text -nooutтільки показує кореневий сертифікат.

як я бачу всі інші сертифікати?

Відповіді:


120

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 пропонує такий однострочний:

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

Це дійсно працювало для мене, але я не розумію деталей, тому не можу сказати, чи є якісь застереження.


9
Це найкраща відповідь - я навіть не буду публікувати своє надмірне рішення Python! Залиште "-текст", щоб просто отримати інформацію про тему / видавця для кожного сертифіката.
Кріс Вольф

Спробував це /etc/ssl/certs/ca-certificates.crtі отримавunable to load PKCS7 object
OrangeDog

1
Це не для формату pkcs7, тоді як питання стосується форматів x509?
Єтатернотеш

3
Він використовує лише pkcs7 як проміжний. Вхід є об'єднаним PEM.
Бені Чернявський-Паскін

Ви супер !!!
Jingguo Yao

21

Java keytoolвиконує фокус:

keytool -printcert -v -file <certs.crt>

Анотація: подвійний клацання Windows не працює. Windows зчитує лише перший сертифікат у сховищі ключів і автоматично розширює ланцюжок довіри зі свого вбудованого магазину сертифікатів.

Результати:

  1. Усі, які перевищують перший сертифікат у .crtфайлі, не відображаються
  2. Ви можете відобразити іншу ланцюжок довіри, ніж у .crtфайлі. Це може призвести до неправильних висновків.

Дякуємо за уточнення речі Windows. Це насправді заплутало пекло від мене
Nick.McDermaid

21

Після цього 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;

10

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

Це потребує кращих пояснень
Свен

3

Це може бути не дуже, або елегантно, але це було швидко і працювало для мене, використовуючи 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 відповідно до цього. Мені б дуже хотілося, щоб для цього було більш елегантне рішення, але в цьому випадку я думаю, що для пошуку більш елегантного рішення знадобилося б більше часу, ніж викрадання неелегантного.


3

Оскільки не існує рішення, засноване на 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. Друга команда прокручує через витягнуті серти і показує їх.


1
Функція переадресації друку у awk доступна у gawk та nawk, але не в базовій awk. І так, це працювало б на Linux (gawk пов'язаний як awk), але не може бути на OS X, яка має базовий awk.
Raghu Dodda

1

У баші зазвичай потрібен лише один (довгий) рядок коду :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

0

Невеликі зміни до повідомлення 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

Довідка: SSL Shopper - відповідник ключа сертифікатів


0

Ось базове рішення, яке не покладається на проміжні файли.

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 сертифікати.


2
Просто для розваги : 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 }'.
Манав

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-й сертифікат.


-2

Метод Windows

Один із способів побачити весь ланцюг - це (звичайно в Windows), щоб двічі клацнути на crt, а потім переглянути на вкладці Шлях сертифікації. Він покаже весь ланцюжок, навіть якщо є лише Проміжний, або Root Cert. Деталі див. На скріншоті нижче. Якщо ви не в Windows, вибачаюся за мою незнання варіантів Unix / Linux.

Примітка: це може призвести до помилкових результатів, якщо проміжний сертифікат знаходиться у вашій локальній магазині ключів, Windows додасть його автоматично, а не покаже лише те, що було в комплекті.

                                      введіть тут опис зображення

Linux (метод Ubuntu)

Я не помітив вашу початкову команду, і у вас є одне на місці. Ваша команда повинна виглядати так:

openssl x509 -in bundle.crt -noout -text

Джерело: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


Дійсно? Я знаю, що це sublte, але ви справді не можете сказати? Моє є openssl x509 -in bundle.crt -noout -text, тоді як у вас є -text -noout ... отже, чому ви, ймовірно, отримуєте синтаксичну помилку.
Бред Бушар

20
Тримай коней, Бред. По-перше, ОП не скаржився на те, що його opensslвиклик призвів до синтаксичної помилки, але в ньому було вказано лише перший сертифікат у групі. По-друге, два виклики функціонально однакові. По-третє, і, мабуть, найголовніше, і для вас не працює, принаймні для мене; він також містить лише перший сертифікат у комплекті.
MadHatter

Так, я не так сильно ставився до речей Ubuntu для таких питань, як я вважав, що він був у Windows, поки не сказав мені інакше. Тож я не хотів залишати ОП висячим, і після невеликого пошуку виявив, що довідковий сайт для цих типів команд перераховував команду, яку я йому дав (той, що має трохи інший синтаксис) і хотів побачити, чи може це допомогу. Ваші бали взяті, але будь ласка, зробіть це з більшою витонченістю наступного разу.
Бред Бушар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.