Question Comment afficher tous les certificats SSL dans un lot?


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

Faire openssl x509 -in bundle.crt -text -noout affiche uniquement le certificat racine.

Comment puis-je voir tous les autres certificats?


76
2018-04-23 18:15


origine




Réponses:


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.


88
2018-04-25 06:27



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é sur /etc/ssl/certs/ca-certificates.crt et j'ai unable to load PKCS7 object - OrangeDog
N'est-ce pas pour le format pkcs7, alors que la question concerne les bundles au format x509? - Yetanotherjosh
Il utilise uniquement pkcs7 comme intermédiaire. L'entrée est concaténée PEM. - Beni Cherniavsky-Paskin
Tu es super!!! - Jingguo Yao


Suivant cette FAQ m'a amené à ce script perl, qui me suggère très fortement que openssl n'a pas de support natif pour gérer le nth certificat dans un paquet, et que nous devons plutôt utiliser un outil pour couper en tranches l'entrée avant de fournir 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 <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 fait le tour:

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

Annotation: Le double-clic de Windows 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 de la .crt les fichiers ne sont pas affichés
  2. Vous pouvez obtenir une chaîne de confiance différente de celle que vous avez dans le .crt fichier. Cela peut conduire à des conclusions erronées.

17
2017-09-03 07:18



Merci d'avoir clarifié le problème des fenêtres. C'était vraiment déroutant l'enfer hors de moi - Nick.McDermaid


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.


3
2017-11-09 01:08





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


3
2018-04-19 06:55



La fonctionnalité de redirection d'impression dans awk est disponible dans gawk et nawk mais pas dans awk de base. Et ainsi, cela fonctionnerait sous Linux (gawk est lié en awk), mais ne fonctionnerait peut-être pas sous OS X qui dispose de awk de base. - Raghu Dodda


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

3
2017-09-23 09:21



Cela nécessite de meilleures explications - Sven♦


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

1
2017-10-23 00:59





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 clé de certificat


0
2018-02-08 09:18





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 passées à openssl sous forme de certificats codés DER.


0
2018-04-23 19:00



Juste pour le fun: 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