web-dev-qa-db-fra.com

Comment afficher tous les certificats SSL dans un bundle?

J'ai un fichier .crt de bundle de certificats.

faire openssl x509 -in bundle.crt -text -noout n'affiche que le certificat racine.

comment voir tous les autres certificats?

118
pdeva

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 suggère ce one-liner:

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

Cela a bien fonctionné pour moi, mais je ne comprends pas les détails, donc je ne peux pas dire s'il y a des mises en garde.

139

keytool de Java fait l'affaire:

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

Annotation: Le double clic de Windows ne fonctionne pas. Windows lit uniquement le premier certificat du magasin de clés et étend automatiquement la chaîne de confiance à partir de son magasin de certificats intégré.

Résultats:

  1. Au-delà du premier certificat dans le .crt le fichier n'est pas affiché
  2. Vous pouvez afficher une chaîne de confiance différente de celle que vous avez dans le .crt fichier. Cela peut conduire à des conclusions erronées.
25
Jan Wunderlich

Suivre cette FAQ m'a conduit à ce script Perl , ce qui me suggère très fortement que openssl n'a pas de support natif pour gérer le ne certificat dans un bundle, et qu'au lieu de cela, nous devons utiliser un outil pour découper et découper l'entrée avant d'alimenter chaque certificat en openssl. Ce script Perl, librement adapté du script de Nick Burch lié ci-dessus, semble faire l'affaire:

#!/usr/bin/Perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <[email protected]>
# v0.0.2         Tom Yates <[email protected]>
#

$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;
22
MadHatter

Oneliner qui affiche un résumé de chaque certificat dans le fichier.

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

(commando similaire mentionné dans une autre réponse, mais cela donne une sortie plus courte, sans l'option --text).

exemple:

$ 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
15
harmv

Cela peut ne pas être joli ou élégant, mais cela a été rapide et a fonctionné pour moi en utilisant bash sur linux et des blocs formatés PEM dans un fichier de bundle 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

Vous pouvez tout mettre sur une seule ligne et ajuster les options openssl en fonction. Je souhaite vraiment qu'il y ait une solution plus élégante pour cela, mais dans ce cas, je pense que trouver la solution la plus élégante aurait pris plus de temps que de pirater la solution inélégante.

4
user2856925

Puisqu'il n'y a pas de solution basée sur 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

La première commande divise le bundle en certificats en recherchant les lignes BEGIN et END. La deuxième commande parcourt les certificats extraits et les affiche.

3
Raghu Dodda

En bash, une seule (longue) ligne de code est généralement nécessaire :-)

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

Je voudrais ajouter la ligne de commande idiomatique Perl ici:

  Perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

S'il y a du texte, alors un Tweak légèrement plus robuste:

 Perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

Modifiez simplement la valeur de ce que n devrait être dans la deuxième instruction pour obtenir le nième certificat.

1
Gerard ONeill

Petite modification au message de MadHatter pour vous permettre de copier/coller directement sur la CLI. J'ai également inclus le hachage MD5, qui est utile pour s'assurer que les certificats sont corrects. La ligne stdin renvoyée est le hachage md5 du ou des certificats.

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

Si vous voulez voir une sortie concise courte Nice, vous utilisez cette version. Utile si vous vérifiez uniquement que vous avez inclus tous vos certificats, mais que vous ne vérifiez pas vraiment l'utilisation/etc. du ou des certificats.

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

Juste au cas où votre version openssl ne prend pas en charge tous ces indicateurs, voici quelques egrep que vous pouvez utiliser. Même chose que la première mais juste à egrep.

Perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

Pour vérifier le hachage MD5 de la clé privée, vous pouvez procéder comme suit.

openssl rsa -noout -modulus -in privateKey.key | openssl md5

Référence: SSL Shopper - Certificate Key Matcher

0
lavermil

Voici une solution basée sur awk qui ne repose pas sur des fichiers intermédiaires.

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

Il fonctionne en lisant les blocs PEM depuis stdin et en concaténant chaque bloc en une seule ligne codée en base64. Les lignes sont ensuite lues, décodées et transmises à openssl en tant que certificats codés DER.

0
Joe