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?
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.
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:
.crt
le fichier n'est pas affiché.crt
fichier. Cela peut conduire à des conclusions erronées.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;
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
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.
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.
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
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.
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
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.