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.
/etc/ssl/certs/ca-certificates.crt
et obtenuunable to load PKCS7 object
Java keytool
fait 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:
.crt
fichier ne sont pas affichés.crt
fichier. Cela peut conduire à des conclusions erronées.À la suite de cette FAQ m'a conduit à ce script perl qui suggère très fortement à moi qui openssl
n'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 <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;
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
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.
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.
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
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.
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 }'
.
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.
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.
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
openssl
invocation 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.