Risposte:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 suggerisce questo one-liner:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
In effetti ha funzionato per me, ma non capisco i dettagli, quindi non posso dire se ci sono avvertimenti.
/etc/ssl/certs/ca-certificates.crt
unable to load PKCS7 object
Java keytool
fa il trucco:
keytool -printcert -v -file <certs.crt>
Annotazione: il doppio clic di Windows non funziona. Windows legge solo il primo certificato nel keystore ed estende automaticamente il trustchain dal suo archivio certificati incorporato.
risultati:
.crt
file non vengono visualizzati.crt
file. Ciò può portare a conclusioni errate.A seguito di questa FAQ mi ha portato a questo script perl , che suggerisce fortemente a me che openssl
non ha il supporto nativo per la gestione del n ° certificato in un fascio, e che invece dobbiamo usare qualche strumento per affettare-and-dice l'ingresso prima di alimentazione di ogni certificato a openssl
. Questa sceneggiatura perl, liberamente adattata dalla sceneggiatura di Nick Burch collegata sopra, sembra fare il lavoro:
#!/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 che visualizza un riepilogo di ogni certificato nel file.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(un comando simile menzionato in un'altra risposta, ma questo fornisce un output più breve, senza l'opzione --text).
esempio:
$ 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
Questo potrebbe non essere carino o elegante, ma è stato veloce e ha funzionato per me usando bash su linux e blocchi formattati PEM in un file 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
Puoi mettere tutto su una riga e regolare le opzioni di openssl per adattarle. Vorrei davvero che ci fosse una soluzione più elegante per questo, ma in questo caso penso che trovare la soluzione più elegante avrebbe richiesto più tempo rispetto a eliminare quella inelegante.
Poiché non esiste una soluzione basata su 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
Il primo comando ha diviso il bundle in certs cercando BEGIN e END lines. Il secondo comando scorre attraverso i certificati estratti e li mostra.
Piccola modifica al post di MadHatter per consentire di copiare / incollare direttamente nella CLI. Ho anche incluso l'hash MD5, che è utile per assicurarsi che i certificati siano corretti. La linea stdin restituita è l'hash md5 dei certificati.
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
Se vuoi vedere un risultato breve e conciso, usi questa versione. Utile se stai solo verificando di aver incluso tutto il tuo certificato, ma non stai controllando realmente l'uso / ecc dei certificati.
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
Nel caso in cui la tua versione di openssl non supporti tutte quelle bandiere, ecco alcuni egrep che puoi usare. Stessa cosa della prima, ma solo pipe per egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Per verificare l'hash MD5 della chiave privata è possibile effettuare le seguenti operazioni.
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Riferimento: SSL Shopper - Certificate Key Matcher
Ecco una soluzione basata su awk che non si basa su file intermedi.
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
Funziona leggendo i blocchi PEM dallo stdin e concatenando ciascun blocco su una singola riga codificata base64. Le righe vengono quindi lette, decodificate e passate a openssl come certificati codificati 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 }'
.
Vorrei inserire la riga di comando idiomatica perl qui:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Se c'è del testo, allora un tweak leggermente più robusto:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Basta cambiare il valore di ciò che n dovrebbe essere nella seconda istruzione per ottenere l'ennesimo certificato.
Un modo in cui puoi vedere l'intera catena è (ovviamente in Windows) fare doppio clic su crt e quindi guardare la scheda Percorso certificazione. Mostrerà l'intera catena anche se c'è solo un Intermedio, o Root Cert. Vedi screenshot di seguito per i dettagli. Se non sei su Windows, mi scuso per la mia mancanza di conoscenza con le varianti Unix / Linux.
Nota: questo può causare risultati falsi se il certificato intermedio si trova nel tuo keystore locale Windows lo aggiungerà automaticamente e non mostrerà solo ciò che era nel bundle.
Ho trascurato il tuo comando iniziale e hai una cosa fuori posto. Il tuo comando dovrebbe apparire così:
openssl x509 -in bundle.crt -noout -text
Fonte: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
invocazione ha dato un errore di sintassi, ma ha elencato solo il primo certificato nel pacchetto. In secondo luogo, le due invocazioni sono funzionalmente identiche. In terzo luogo, e probabilmente soprattutto, il tuo non funziona, almeno per me; anch'esso elenca solo il primo certificato nel pacchetto.