Respuestas:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 sugiere esta frase:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
De hecho funcionó para mí, pero no entiendo los detalles, así que no puedo decir si hay alguna advertencia.
/etc/ssl/certs/ca-certificates.crt
y conseguíunable to load PKCS7 object
Java keytool
hace el truco:
keytool -printcert -v -file <certs.crt>
Anotación: el doble clic de Windows no funciona. Windows solo lee el primer certificado en el almacén de claves y extiende automáticamente la cadena de confianza desde su almacén de certificados incorporado.
Resultados:
.crt
archivo no se muestra.crt
archivo. Esto puede llevar a conclusiones erróneas.Siguiendo este FAQ me llevó a este script Perl , lo que sugiere muy fuertemente a mí que openssl
no tiene soporte nativo para el manejo de la n º certificado en un paquete, y que en lugar debemos usar alguna herramienta para cortar-y-dados de la entrada antes de alimentar a cada uno certificado a openssl
. Este guión perl, adaptado libremente del guión de Nick Burch vinculado anteriormente, parece hacer el trabajo:
#!/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 que muestra un resumen de cada certificado en el archivo.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(Comando similar mencionado en otra respuesta, pero esto da una salida más corta, sin la opción --text).
ejemplo:
$ 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
Puede que esto no sea bonito o elegante, pero fue rápido y funcionó para mí usando bash en linux y bloques formateados PEM en un archivo de paquete 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
Puede ponerlo todo en una línea y ajustar las opciones de openssl para adaptarlas. Realmente desearía que hubiera una solución más elegante para esto, pero en este caso creo que encontrar la solución más elegante habría llevado más tiempo que hackear la poco elegante.
Como no hay una solución basada en 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
El primer comando divide el paquete en certs buscando BEGIN y END lines. El segundo comando recorre los certificados extraídos y los muestra.
Pequeña modificación en la publicación de MadHatter para permitirle copiar / pegar directamente a la CLI. También incluí el hash MD5, que es útil para asegurarme de que los certificados sean correctos. La línea estándar devuelta es el hash md5 de los certificados.
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 desea ver una salida breve y concisa, utilice esta versión. Es útil si solo está verificando que ha incluido todos sus certificados, pero realmente no está verificando el uso / etc de los certificados.
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
En caso de que su versión de openssl no sea compatible con todos esos indicadores, aquí hay algunos egrep que puede usar. Lo mismo que el primero pero solo pipa a egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Para verificar el hash MD5 de la clave privada, puede hacer lo siguiente.
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Referencia: SSL Shopper - Certificado Key Matcher
Aquí hay una solución basada en awk que no se basa en archivos intermedios.
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
Funciona leyendo bloques PEM de stdin y concatenando cada bloque en una sola línea codificada en base64. Las líneas se leen, decodifican y pasan a openssl como certificados codificados 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 }'
.
Me gustaría agregar la línea de comandos perl idiomática aquí:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Si hay texto, entonces un ajuste un poco más robusto:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Simplemente cambie el valor de lo que n debería estar en la segunda declaración para obtener el enésimo certificado.
Una forma de ver toda la cadena es (en Windows, por supuesto) hacer doble clic en el CRT y luego buscar en la pestaña Ruta de certificación. Mostrará toda la cadena incluso si solo hay un Certificado intermedio o de raíz. Ver captura de pantalla a continuación para más detalles. Si no está en Windows, me disculpo por mi falta de conocimiento con las variantes de Unix / Linux.
Nota: esto puede causar resultados falsos si el certificado intermedio está en su almacén de claves local. Windows lo agregará automáticamente y no mostrará solo lo que estaba en el paquete.
Pasé por alto tu comando inicial y tienes una cosa fuera de lugar. Su comando debería verse así:
openssl x509 -in bundle.crt -noout -text
Fuente: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
invocación dio un error de sintaxis, sino que solo enumeró el primer certificado del paquete. En segundo lugar, las dos invocaciones son funcionalmente idénticas. En tercer lugar, y probablemente lo más importante, el tuyo tampoco funciona, al menos para mí; también enumera solo el primer certificado del paquete.