Comment afficher tous les certificats SSL dans un lot?

102

J'ai un fichier .crt de paquet de certificat.

faire openssl x509 -in bundle.crt -text -nooutne montre que le certificat racine.

Comment puis-je voir tous les autres certificats?

PDeva
la source

Réponses:

121

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, je ne peux donc pas dire s’il ya des mises en garde.

Beni Cherniavsky-Paskin
la source
9
C’est la meilleure réponse - je ne publierai même pas ma solution Python trop meurtrière! Laissez le "texte" pour obtenir uniquement les informations sur le sujet / l'émetteur de chaque certificat.
Chris Wolf
Essayé /etc/ssl/certs/ca-certificates.crtet obtenuunable to load PKCS7 object
OrangeDog
1
N'est-ce pas pour le format pkcs7, alors que la question concerne les bundles au format x509?
Yetanotherjosh
3
Il utilise uniquement pkcs7 comme intermédiaire. L'entrée est concaténée PEM.
Beni Cherniavsky-Paskin Le
Tu es super!!!
Jingguo Yao
22

Java keytoolfait le tour:

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

Annotation: Windows double-clic ne fonctionne pas. Windows ne lit que 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. Tout au-delà du premier certificat du .crtfichier ne sont pas affichés
  2. Vous pouvez obtenir une chaîne de confiance différente de celle que vous avez dans le .crtfichier. Cela peut conduire à des conclusions erronées.
Jan Wunderlich
la source
Merci d'avoir clarifié le problème des fenêtres. C'était vraiment déroutant pour moi
Nick.McDermaid
21

À la suite de cette FAQ m'a conduit à ce script perl qui suggère très fortement à moi qui openssln'a pas de support natif pour la manipulation du n ième certificat dans un paquet, et qu'au lieu nous devons utiliser un outil pour couper-et dés l'entrée avant d' alimenter chaque certificat à 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;
Chapelier Fou
la source
10

Oneliner qui affiche un résumé de chaque certificat du 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
nuisible
la source
Cela nécessite de meilleures explications
Sven
3

Ce n'est peut-être pas joli, ni élégant, mais cela a été rapide et a fonctionné pour moi en utilisant bash sur linux et des blocs au format PEM dans un fichier 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 ligne et ajuster les options openssl en fonction. J'aimerais vraiment qu'il y ait une solution plus élégante pour cela, mais dans ce cas, je pense que trouver la solution plus élégante aurait pris plus de temps que de chercher la solution la moins élégante.

utilisateur2856925
la source
3

Comme 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 scinde bundle en certs en recherchant les lignes BEGIN et END. La deuxième commande parcourt les certs extraits et les affiche.

Raghu Dodda
la source
1
La fonctionnalité de redirection d'impression dans awk est disponible dans gawk et nawk mais pas dans awk de base. Et ainsi, cela fonctionnerait sur Linux (gawk est lié en tant que awk), mais pourrait ne pas sur OS X qui possède un awk de base.
Raghu Dodda
1

En bash, en général, une seule (longue) ligne de code est 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
Marco
la source
0

Petite modification au message de MadHatter pour vous permettre de copier / coller directement dans la CLI. J'ai également inclus le hachage MD5, ce 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 belle sortie concise, 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 drapeaux, voici quelques exemples que vous pouvez utiliser. Même chose que le premier mais juste pipe à 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 - Correspondant de clé de certificat

lavermil
la source
0

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

Cela fonctionne en lisant des blocs PEM à partir de 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 sous forme de certificats codés DER.

Joe
la source
2
Juste pour le plaisir: 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
0

Je voudrais ajouter ici la ligne de commande idiomatique de Perl:

  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

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

Gerard ONeill
la source
-2

Méthode Windows

Une façon de voir toute la chaîne consiste (sous Windows bien sûr) à double-cliquer sur le crt puis à regarder dans l'onglet Chemin de certification. Cela montrera toute la chaîne même s'il y a seulement un Cert Intermediate ou Root Cert. Voir capture d'écran ci-dessous pour plus de détails. Si vous n'êtes pas sous Windows, je m'excuse de mon manque de connaissances sur les variantes Unix / Linux.

Remarque: cela peut entraîner des résultats erronés si le certificat intermédiaire se trouve dans votre magasin de clés local. Windows l'ajoutera automatiquement et ne montrera pas uniquement le contenu de l'ensemble.

                                      entrez la description de l'image ici

Linux (méthode Ubuntu)

J'ai oublié votre commande initiale et vous avez une chose à sa place. Votre commande devrait ressembler à ceci:

openssl x509 -in bundle.crt -noout -text

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

Brad Bouchard
la source
Vraiment? Je sais que c'est sublte mais vous ne pouvez vraiment pas dire? My est openssl x509 -in bundle.crt -noout -text, alors que le vôtre a -text -noout ... par conséquent, vous obtenez probablement une erreur de syntaxe.
Brad Bouchard
20
Tenez vos chevaux, Brad. Premièrement, l'OP ne s'est pas plaint du fait que son opensslinvocation donnait une erreur de syntaxe, mais qu'il ne répertoriait que le premier certificat de l'ensemble. Deuxièmement, les deux invocations sont fonctionnellement identiques. Troisièmement, et probablement le plus important, le vôtre ne fonctionne pas non plus, du moins pour moi; lui aussi ne répertorie que le premier certificat de l’ensemble.
MadHatter
Ouais, je ne suis pas aussi doué pour Ubuntu pour des problèmes comme celui-ci et je pensais qu'il était sous Windows jusqu'à ce qu'il me dise le contraire. Donc, je ne voulais pas laisser le bloc opératoire en suspens et après une petite recherche, j'ai trouvé qu'un site de référence pour ces types de commandes listait la commande que je lui avais donnée (celle avec une syntaxe légèrement différente) et je voulais voir si cela pouvait se faire. Aidez-moi. Vos points sont pris, mais s'il vous plaît faites-le avec plus de grâce la prochaine fois.
Brad Bouchard