Как просмотреть все сертификаты ssl в комплекте?

102

У меня есть файл сертификата .crt.

при этом openssl x509 -in bundle.crt -text -nooutотображается только корневой сертификат.

как я вижу все другие сертификаты?

pdeva
источник

Ответы:

121

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 предлагает следующую строку:

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

Это действительно сработало для меня, но я не понимаю деталей, поэтому не могу сказать, есть ли какие-то предостережения.

Бени Чернявский-Паскин
источник
9
Это самый лучший ответ - я даже не буду публиковать свое решение Python для уничтожения! Оставьте "-text", чтобы просто получить информацию о субъекте / эмитенте для каждого сертификата.
Крис Вольф
Попробовал /etc/ssl/certs/ca-certificates.crtи получилunable to load PKCS7 object
OrangeDog
1
Разве это не для формата pkcs7, тогда как вопрос касается пакетов формата x509?
Yetanotherjosh
3
Он использует только pkcs7 в качестве промежуточного. Входные данные связаны с PEM.
Бени Чернявский-Паскин
Ты супер!!!
Цзинго Яо
22

Java keytoolделает свое дело:

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

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

Результаты:

  1. Все, кроме первого сертификата, в .crtфайле не отображаются
  2. Вы можете получить другую цепочку доверия, отличную от указанной в .crtфайле. Это может привести к неправильным выводам.
Ян Вундерлих
источник
Спасибо за разъяснение по поводу окон. Это действительно меня
запутало
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
harmv
источник
Это требует лучшего объяснения
Свен
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 в соответствии с вашими предпочтениями. Мне бы очень хотелось, чтобы для этого было более элегантное решение, но в этом случае я думаю, что нахождение более элегантного решения заняло бы больше времени, чем взломать неэлегатное.

user2856925
источник
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.
Рагху Додда
1

В bash обычно требуется только одна (длинная) строка кода :-)

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

Небольшое изменение поста 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

Ссылка: SSL Shopper - Сертификат соответствия ключей

lavermil
источник
0

Вот решение на основе 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 из 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 во втором операторе, чтобы получить n-й сертификат.

Жерар ОНЕЙЛ
источник
-2

Метод Windows

Один из способов увидеть всю цепочку - это (конечно, в Windows) дважды щелкнуть crt, а затем посмотреть на вкладку «Certification Path». Он покажет всю цепочку, даже если есть только Intermediate или 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

Брэд Бушар
источник
В самом деле? Я знаю, что это изысканно, но ты действительно не можешь сказать? Мой openssl x509 -in-bundle.crt -noout -text, а у вас -text -noout ... и поэтому вы, вероятно, получаете синтаксическую ошибку.
Брэд Бушар
20
Держи лошадей, Брэд. Во-первых, OP не жаловался, что его opensslвызов дал синтаксическую ошибку, но он перечислил только первый сертификат в комплекте. Во-вторых, два вызова функционально идентичны. В-третьих, и, вероятно, самое главное, ваш не работает, по крайней мере для меня; в нем также указан только первый сертификат в комплекте.
MadHatter
Да, я не настолько хорошо отношусь к Ubuntu в таких вещах, как эта, и думал, что он был в Windows, пока не сказал мне иначе. Поэтому я не хотел оставлять «зависание» OP и после небольшого поиска обнаружил, что в справочном сайте для этих типов команд была указана команда, которую я ему дал (с немного другим синтаксисом), и хотел посмотреть, сможет ли она Помогите. Ваши очки взяты, но, пожалуйста, сделайте это с большей грацией в следующий раз.
Брэд Бушар