x.509: Certificados digitales DER, CRT y CER

Publicado por Diego Córdoba en

Hoy aclararemos algunas dudas respecto de los certificados digitales X.509, formatos y extensiones de los archivos y, por qué no, algunos comandos útiles de la suite OpenSSL.

Este artículo forma parte de la Serie sobre Criptografía Aplicada publicada en este blog. Pueden visitar el índice de la serie para acceder a todo el contenido.


openssl ssl x509 x.509 crypto certificado certificate digital signature pem cert crt cer der

Un certificado digital x.509 es un documento digital que ha sido codificado y/o firmado digitalmente de acuerdo a la RFC 5280.

De hecho, el término «Certificado x.509» usualmente se refiere al certificado PKIX de la IETF, y al perfil CRL del estándar de certificados digitales x.509 v3 especificado en la RFC 5280, donde PKIX hace referencia a la Infraestructura de clave pública x.509 (Public Key Infrastructure X.509).

El estándar X.509 solo define la sintaxis de los certificados, por lo que no está atado a ningún algoritmo en particular, y contempla los siguientes campos en su estructura:

  • Version.
    Especifica cuál de las tres versiones de x.509 se aplica a este certificado.
  • Numero de serie.
    Es un identificador único para todos los certificados de una misma CA.
  • Identificador del algoritmo empleado para la firma digital.
    Qué algoritmo utilizó la CA del certificado para firmarlo.
  • Nombre del certificador.
    Nombre de la CA.
  • Periodo de validez.
    Por seguridad, los certificados tiene un tiempo de vida.
  • Nombre del sujeto.
    Nombre del dueño del certificado.
  • Clave publica del sujeto.
    Clave pública del dueño del certificado, y algoritmo asociado.
  • Extensiones.
    Información adicional permitida por el estándar.
  • Firma digital de todo lo anterior generada por el certificador.
    Firma digital de la CA.

Un ejemplo de un certificado X.509 podría ser el siguiente:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0a:01:41:42:00:00:01:53:85:73:6a:0b:85:ec:a7:08
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O = Digital Signature Trust Co., CN = DST Root CA X3
        Validity
            Not Before: Mar 17 16:40:46 2016 GMT
            Not After : Mar 17 16:40:46 2021 GMT
        Subject: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:9c:d3:0c:f0:5a:e5:2e:47:b7:72:5d:37:83:b3:
                    [...]
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            Authority Information Access: 
                OCSP - URI:http://isrg.trustid.ocsp.identrust.com
                CA Issuers - URI:http://apps.identrust.com/roots/dstrootcax3.p7c
            X509v3 Authority Key Identifier: 
                C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.root-x1.letsencrypt.org
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://crl.identrust.com/DSTROOTCAX3CRL.crl
            X509v3 Subject Key Identifier: 
                A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        dd:33:d7:11:f3:63:58:38:dd:18:15:fb:09:55:be:76:56:b9:
        [...]

Formatos de los archivos X.509

Un punto importante a entender acá, y que puede generar confusiones entre los usuarios de certificados digitales X.509, son las extensiones (o formatos, mejor) que éstos pueden tener.

Existe mucha confusión al respecto de las extensiones DER, PEM, CRT y CER, y generalmente, y de manera incorrecta, muchos piensan que pueden utilizarse e intercambiarse sin generar conflictos.

Mientras que en ciertos casos algunas de estas extensiones pueden intercambiarse, la mejor práctica es la de identificar cómo está codificado internamente el certificado, y entonces etiquetarlo correctamente con la extensión que corresponda, ya que esto evitará problemas luego a la hora de manipular los certificados digitales.

Codificación de los certificados digitales

Las siguientes codificaciones de formato también suelen utilizarse como extensiones en los archivos de certificados digitales. A saber:

DER

La extensión DER es utilizada para certificados digitales codificados en forma binaria. Estos archivos también suelen tener la extensión CRT o CER. DER es un tipo de codificación de certificados X.509, NO un tipo de certificado, de modo que la expresión «Tengo un certificado DER» es incorrecta, y debería optarse por «Tengo un certificado X.509 codificado en formato DER».

PEM

Estos certificados están codificados en Base64 / ASCII, y generalmente se utilizan para certificados digitales X.509 v3… son aquellos que al abrirlos con un editor de texto comienzan y terminan con líneas similares a las siguientes:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Extensiones de certificados digitales X.509

CRT

Esta extensión es utilizada para certificados propiamente dichos. Los certificados pueden ser codificados en binarios DER o como ASCII PEM. Las extensiones CER y CRT podrían considerarse sinónimos.

Es la extensión más utilizada en sistemas *nix, como Linux o Unix.

CER

Es una extensión alternativa a la CRT pero siguiendo las convenciones de Microsoft. La extensión CER es también reconocida por Internet Explorer como un comando para correr un ejecutable de la API de criptografía de Microsoft, y es utilizada principalmente por rundll32.exe, cryptext.dll, y CryptExtOpenCER, que muestran un mensaje de diálogo dando la posibilidad de importar el certificado en el sistema, o analizar su contenido.

La única ocasión en la que podemos intercambiar libremente las extensiones CRT y CER sin tener problemas, es cuando el certificado tiene la misma codificación… es decir, por ejemplo, cuando el certificado tiene extensión CRT o CER, pero su codificación es PEM.

KEY

Esta extensión es utilizada tanto para la clave pública como la privada de los estándares PKCS. Estas claves pueden estar codificadas en formato binario DER o ASCII PEM.

Manipulando certificados x.509 con OpenSSL

Para completar este artículo, vamos a analizar cuatro formas básicas de manipular certificados digitales X.509 utilizando openssl. Estas son, ver el certificado, convertirlo, combinarlo, y extraer claves desde el mismo.

Vamos a ello.

Ver el contenido de un certificado digital

Los certificados en general no tienen un formato legible al humano, incluso los formatos Base64 PEM, por lo que haremos uso de las herramientas provistas por OpenSSL para analizar su contenido.

Para ver el contenido de un certificado en formato PEM (independientemente de su extensión) podemos utilizar el siguiente comando:

openssl x509 -in /etc/ssl/cert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 6828503384748696800 (0x5ec3b7a6437fa4e0)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN = ACCVRAIZ1, OU = PKIACCV, O = ACCV, C = ES
        Validity
            Not Before: May  5 09:37:37 2011 GMT
            Not After : Dec 31 09:37:37 2030 GMT
        Subject: CN = ACCVRAIZ1, OU = PKIACCV, O = ACCV, C = ES
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:9b:a9:ab:bf:61:4a:97:af:2f:97:66:9a:74:5f:
                    [...]
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            Authority Information Access: 
                CA Issuers - URI:http://www.accv.es/fileadmin/Archivos/certificados/raizaccv1.crt
                OCSP - URI:http://ocsp.accv.es
            X509v3 Subject Key Identifier: 
                D2:87:B4:E3:DF:37:27:93:55:F6:56:EA:81:E5:36:CC:8C:1E:3F:BD
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Authority Key Identifier: 
                D2:87:B4:E3:DF:37:27:93:55:F6:56:EA:81:E5:36:CC:8C:1E:3F:BD
            X509v3 Certificate Policies: 
                Policy: X509v3 Any Policy
                  User Notice:
                    Explicit Text: 
                  CPS: http://www.accv.es/legislacion_c.htm
            X509v3 CRL Distribution Points: 
                Full Name:
                  URI:http://www.accv.es/fileadmin/Archivos/certificados/raizaccv1_der.crl
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Subject Alternative Name: 
                email:accv@accv.es
    Signature Algorithm: sha1WithRSAEncryption
    Signature Value:
        97:31:02:9f:e7:fd:43:67:48:44:14:e4:29:87:ed:4c:28:66:
        [...]

En el caso de obtener un error similar a este:

unable to load certificate
12626:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

Significa que estamos intentando ver el contenido de un certificado binario con formato DER.

Para poder ver este tipo de certificados, necesitamos utilizar un comando similar a este:

openssl x509 -in certificado.der -inform der -text -noout

Convertir entre formatos de certificados digitales

A veces, y dependiendo de las aplicaciones en las que vayamos a utilizar los certificados, puede que sea necesario cambiar el formato de un certificado.

Esto no es tarea difícil para la suite OpenSSL, y podemos llevarla a cabo de las siguientes maneras:

  • Convirtiendo PEM a DER:
openssl x509 -in cert.crt -outform der -out cert.der
  • Convirtiendo DER a PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

Combinar piezas X.509 en un mismo archivo

En algunos casos es conveniente combinar varias piezas de la infraestructura X.509, tales como certificados digitales/claves públicas, y claves privadas, en un mismo archivo… de hecho, un uso común es tener en el mismo archivo combinadas la clave pública en formato de certificado digital, y la clave privada.

La forma más simple de hacerlo es tener, tanto claves como certificados, almacenados en archivos con formato ASCII Base64 PEM, y simplemente copiar en un solo archivo de texto, mediante línea de comandos o algún editor de texto, los contenidos de los archivos PEM en un nuevo archivo de texto, que será también de formato PEM.

Extraer claves desde un certificado

Por último, y sabiendo que un certificado digital X.509 se compone de metainformación agregada a una clave pública, utilizando la suite OpenSSL también podemos extraer la clave desde el certificado.

Supongamos que tenemos un certificado en formato PEM (si es DER, podemos convertirlo como se vio mas arriba). Podemos extraer la calve pública con un comando similar a este:

openssl x509 -inform pem -in cert.crt -pubkey -noout > pub.key

Donde pub.key es la clave pública resultante, también en formato PEM.

Conclusiones

Hemos aprendido algunos conceptos acerca de los certificados digitales X.509, su estructura, extensiones y codificaciones, y algunos comandos OpenSSL interesantes para poder ver el contenido y la información de un certificado, y convertirlos a diferentes formatos de codificación.

Por supuesto, OpenSSL es una suite de comandos muy extensa, y que brinda muchas posibilidades a la hora de trabajar con criptografía, tanto simétrica como asimétrica… tanto que da para uno o más artículos comentando comandos y modificadores 🙂

Espero que les resulte interesante y constructivo!

Cualquier comentario o aporte son invitados a hacerlo!!

Será hasta la próxima!


Fuente principal: http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/

¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador