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

Быстрое-и-грязное решение для сниффинга единого устройства на состоит в том, чтобы добавить второй NIC, подключить устройство, которое будет сниффинговым к одному NIC (использующий перекрестный кабель при необходимости) и LAN другому, затем соединить мостом соединения и сниффинг в интерфейсе моста. Так как Вы не втискиваете машину в поток интенсивного движения (по-видимому), Вы ничего действительно не замедлите.

Можно сделать это в Windows w/встроенная функциональность образования моста и что-то как Wireshark. Linux позволит Вам сделать то же самое. Пробег другой ОС может варьироваться - я не попробовал его нигде, но в Windows и Linux.

104
задан 25 April 2014 в 08:59
14 ответов

Я хотел бы добавить идиоматическую командную строку жемчуга здесь:

  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 должен быть во втором операторе для получения энного сертификата.

0
ответ дан 28 November 2019 в 19:20

Windows Method

One way you can see the whole chain is (in Windows of course) to double click the crt and then look on the Certification Path tab. It will show the whole chain even if there is only an Intermediate, or Root Cert. See screenshot below for details. If you're not on Windows I apologize for my lack of knowledge with Unix/Linux variants.

Note: this can cause false results if the intermediate certificate is in your local keystore Windows will add it automatically and not show only what was in the bundle.

enter image description here

Linux (Ubuntu Method)

I overlooked your initial command and you have one thing out of place. Your command should look like this:

openssl x509 -in bundle.crt -noout -text

Source: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html

-2
ответ дан 28 November 2019 в 19:20

После этот FAQ привел меня к этому сценарию perl , который очень убедительно подсказывает мне, что openssl не имеет встроенной поддержки для обработки сертификата n th в пакете, и что вместо этого мы должны использовать какой-нибудь инструмент для нарезки входных данных перед отправкой каждого сертификата в 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;
21
ответ дан 28 November 2019 в 19:20

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

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

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

Результаты:

  1. Все, кроме первого сертификата в файле .crt , не отображаются
  2. ] Вы можете отобразить цепочку доверия, отличную от той, которая представлена ​​в файле .crt . Это может привести к неправильным выводам.
22
ответ дан 28 November 2019 в 19:20

Это может не будь красивым или элегантным, но это было быстро и сработало для меня с использованием 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
ответ дан 28 November 2019 в 19:20

В 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
ответ дан 28 November 2019 в 19:20

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

0
ответ дан 28 November 2019 в 19:20

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

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

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

124
ответ дан 28 November 2019 в 19:20

Так как не существует решения на основе 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

Первая команда разбивает связку на certs, ищет BEGIN, и END строки. Вторая команда проходит через извлечённые штыри и показывает их.

.
3
ответ дан 28 November 2019 в 19:20

Вот решение на основе 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 из стандартного ввода и объединяя каждый блок в одну строку в кодировке base64. Затем читаются строки,декодируется и передается в openssl как сертификаты в формате DER.

0
ответ дан 28 November 2019 в 19:20

Одиночная прокладка, которая отображает сводку каждого сертификата в файле.

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

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

пример:

$ 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
12
ответ дан 28 November 2019 в 19:20

@user1686 предложил другое решение в https://superuser.com/questions/1599666/view-all-certs-in-a-pem-cert-file-full-cert-chain-with-openssl-or-another-comm

это часть стек GnuTLS.

certtool -i < multiplecerts.pem
0
ответ дан 5 November 2020 в 07:52

Попробуйте этот скрипт: https://github.com/jkolezyn/cert_tree

Он печатает сертификаты в пакете pem в виде дерева, построенного на основе полей Subject и Issuer.

Он выводит такое дерево:

cert_tree.py -p ~/.certs/ca_list.pem  
━ CorpRoot            [1]
    ┣━ ServerCA       [2]
    ┣━ example_cert   [3]
    ┗━ example_2      [8]
━ RootCert            [4]
    ┣━ example_cert3  [5] [EXPIRED on: 2019-06-03 13:26:21]
    ┣━ other          [6]
    ┣━ other1         [7] [EXPIRED on: 2017-06-16 21:12:18]
    ┗━ AnotherOne     [9]

cert_tree.py -pe ~/.certs/mycert.pem
━ RootCert                [3] [valid until: 2031-07-08 17:57:15]
    ┗━ IntermediateCert   [2] [valid until: 2023-07-08 18:55:58]
        ┗━ UserCert       [1] [valid until: 2023-09-17 13:33:00]
1
ответ дан 24 April 2021 в 09:20
openssl storeutl -noout -text -certs bundle.crt
Перефразируя документацию OpenSSL:

Приложение openssl storeutlбыло добавлено в OpenSSL 1.1.1.

Команда storeutlможет использоваться для отображения содержимого, полученного из заданных URI.

  • -nooutпредотвращает вывод данных PEM
  • -textраспечатывает объекты в текстовом виде, как -textвывод изopenssl x509
  • -certsВыбирайте сертификаты только из заданного URI
4
ответ дан 7 October 2021 в 16:06

Теги

Похожие вопросы