¿Cómo ver todos los certificados SSL en un paquete?


102

Tengo un paquete de certificados .crt archivo.

haciendo openssl x509 -in bundle.crt -text -nooutsolo muestra el certificado raíz.

¿Cómo veo todos los demás certificados?

Respuestas:


121

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.


99
Esta es la mejor respuesta: ¡ni siquiera publicaré mi solución Python de sobrecompresión! Omita el "-texto" para obtener información del sujeto / emisor de cada certificado.
Chris Wolf

Probé /etc/ssl/certs/ca-certificates.crty conseguíunable to load PKCS7 object
OrangeDog

1
¿No es esto para el formato pkcs7, mientras que la pregunta es sobre los paquetes de formato x509?
Yetanotherjosh

3
Solo usa pkcs7 como intermedio. La entrada es PEM concatenado.
Beni Cherniavsky-Paskin

¡¡¡Eres súper!!!
Jingguo Yao

22

Java keytoolhace 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:

  1. Todo más allá del primer certificado en el .crtarchivo no se muestra
  2. Es posible que se muestre una cadena de confianza diferente de la que tiene en el .crtarchivo. Esto puede llevar a conclusiones erróneas.

Gracias por aclarar lo de Windows. Esto realmente me confundió
muchísimo

21

Siguiendo este FAQ me llevó a este script Perl , lo que sugiere muy fuertemente a mí que opensslno 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;

10

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

Esto necesita mejores explicaciones
Sven

3

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.


3

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.


1
La función de redirección de impresión en awk está disponible en gawk y nawk pero no en awk básico. Y así, esto funcionaría en Linux (gawk está vinculado como awk), pero podría no funcionar en OS X que tiene awk básico.
Raghu Dodda

1

En bash, generalmente solo se necesita una línea (larga) de código :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

0

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


0

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.


2
Sólo por diversión: 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

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.


-2

Método de Windows

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.

                                      ingrese la descripción de la imagen aquí

Linux (Método Ubuntu)

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


De Verdad? Sé que es sutil pero ¿realmente no puedes decirlo? Mi es openssl x509 -in bundle.crt -noout -text, mientras que el suyo tiene -text -noout ... de ahí que probablemente obtenga un error de sintaxis.
Brad Bouchard el

20
Sostén tus caballos, Brad. En primer lugar, el OP no se quejó de que su opensslinvocació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.
MadHatter

Sí, no estoy tan del lado de Ubuntu para problemas como este y pensé que estaba en Windows hasta que me dijo lo contrario. Así que no quería dejar el OP suspendido y después de hacer una pequeña búsqueda encontré que un sitio de referencia para este tipo de comandos enumeraba el comando que le di (el que tenía una sintaxis ligeramente diferente) y quería ver si podía ayuda. Sus puntos están tomados, pero hágalo con más gracia la próxima vez.
Brad Bouchard el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.