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


Tengo un archivo .crt paquete de certificado.

obra openssl x509 -in bundle.crt -text -noout Solo muestra el certificado raíz.

¿Cómo veo todos los otros certificados?


76
2018-04-23 18:15


origen




Respuestas:


http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 sugiere esto de una sola línea:

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 advertencias.


88
2018-04-25 06:27



Esta es la mejor respuesta. ¡Ni siquiera publicaré mi solución de Python que está sobre matando! Deje el "-texto" para obtener información del sujeto / emisor para cada certificado. - Chris Wolf
Lo probé /etc/ssl/certs/ca-certificates.crt y consiguió unable to load PKCS7 object - OrangeDog
¿No es esto para el formato pkcs7, mientras que la pregunta es sobre los paquetes de formato x509? - Yetanotherjosh
Solo usa pkcs7 como intermedio. La entrada es concatenada PEM. - Beni Cherniavsky-Paskin
¡¡¡Eres súper!!! - Jingguo Yao


Siguiendo esta FAQ me llevó a este script perl, lo que me sugiere muy fuertemente que openssl no tiene soporte nativo para manejar el norteth certificado en un paquete, y que en su lugar debemos usar alguna herramienta para dividir y cortar la entrada antes de enviar cada certificado a openssl. Este script de Perl, adaptado libremente del script 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;

20
2018-03-27 13:29





De Java keytool Hace el truco:

keytool -printcert -v -file <certs.crt>

Anotación: Windows doble clic no funciona. Windows solo lee el primer certificado en el almacén de claves y extiende automáticamente la cadena de confianza de su almacén de certificados integrado.

Resultados:

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

17
2017-09-03 07:18



Gracias por aclarar la cosa de las ventanas. Esto fue realmente confuso al infierno fuera de mí - Nick.McDermaid


Puede que no sea bonito ni elegante, pero fue rápido y funcionó para mí utilizando 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 que se adapten. 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 hubiera tomado más tiempo que eliminar a la poco elegante.


3
2017-11-09 01:08





Dado que 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 dividió el paquete en certificados buscando las líneas BEGIN y END. El segundo comando recorre los certificados extraídos y los muestra.


3
2018-04-19 06:55



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 puede que no en OS X, que tiene awk básico. - Raghu Dodda


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 un resultado más corto, 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

3
2017-09-23 09:21



Esto necesita mejores explicaciones. - Sven♦


Por lo general, en bash 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

1
2017-10-23 00:59





Pequeña alteración en la publicación de MadHatter para permitirle copiar / pegar directamente en la CLI. También incluí el hash MD5, que es útil para asegurarse de que los certificados son 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 concisa corta y agradable, utilice esta versión. Útil si solo está verificando que ha incluido todo su certificado, pero realmente no está verificando el uso / etc del certificado (s).

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 tubo 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 de clave de coincidencia


0
2018-02-08 09:18