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


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

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

как я могу увидеть все другие сертификаты?


69
2018-04-23 18:15


Источник




Ответы:


http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 предлагает этот однострочный вкладыш:

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

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


80
2018-04-25 06:27



Это лучший ответ - я даже не могу опубликовать мое решение Python с избыточным убитием! Оставьте «-текст», чтобы получить информацию о субъекте / эмитенте для каждого сертификата. - Chris Wolf
Пробовал /etc/ssl/certs/ca-certificates.crt и получил unable to load PKCS7 object - OrangeDog
Разве это не для формата pkcs7, тогда как вопрос касается пакетов формата x509? - Yetanotherjosh
Он использует только pkcs7 как промежуточный. Ввод конкатенируется PEM. - Beni Cherniavsky-Paskin


Следующий этот 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;

20
2018-03-27 13:29





в Java keytool делает трюк:

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

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

Результаты:

  1. Все за пределами первого сертификата в .crt файл не отображается
  2. Вы можете получить другую контрольную цепочку, чем у вас в .crt файл. Это может привести к неправильным выводам.

16
2017-09-03 07:18



Спасибо за то, что я прояснил ситуацию с окнами. Это меня действительно сбило с толку - Nick.McDermaid


Это может быть не очень красиво или изящно, но это было быстро и сработало для меня, используя bash on 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
2017-11-09 01:08





Поскольку нет решения на основе 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. Вторая команда проходит через извлеченные сертификаты и показывает их.


3
2018-04-19 06:55



Функция перенаправления печати в awk доступна в gawk и nawk, но не в базовом awk. Итак, это будет работать на Linux (gawk связан как awk), но не может быть OS X с базовым awk. - Raghu Dodda


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
2017-09-23 09:21



Это требует лучшего объяснения - Sven♦


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

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

1
2017-10-23 00:59





Небольшое внесение изменений в сообщение 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

Если вы хотите увидеть хороший короткий краткий вывод, вы используете эту версию. Полезно, если вы только проверяете, что вы включили весь свой сертификат, но не проверяете использование / etc сертификата (ов).

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. То же самое, что и первое, но только pipe to 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 - ключ сертификата


0
2018-02-08 09:18





Вот решение на основе 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-кодированные сертификаты.


0
2018-04-23 19:00



Просто для удовольствия: 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 }', - Manav


Метод Windows

Один из способов увидеть всю цепочку (в Windows, конечно), чтобы дважды щелкнуть crt, а затем посмотреть на вкладке «Путь к сертификату». Он покажет всю цепочку, даже если есть только промежуточный, или Root Cert. Подробнее см. Снимок экрана ниже. Если вы не в Windows, я приношу свои извинения за недостаток знаний с вариантами Unix / Linux.

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

enter image description here

Linux (метод Ubuntu)

Я упустил из виду вашу первоначальную команду, и у вас есть одно неуместное. Ваша команда должна выглядеть так:

openssl x509 -in bundle.crt -noout -text

Источник: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


-2



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