Convertir claus i certificats amb OpenSSL

Generar clau privada i CSR

Per a generar una clau privada i un CSR amb OpenSSL la manera més senzilla és utilitzant un fitxer de configuració com el següent:

$ cat openssl.conf 
[ req ]
value_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
[ req_distinguished_name ]

commonName = Domini
commonName_value = bernado.cat

organizationName = Organitzacio
organizationName_value = ACME S.A.

organizationalUnitName = Departament
organizationalUnitName_value = Desenvolupament

emailAddress = Email
emailAddress_value = email@example.com

localityName = Localidad
localityName_value = Barcelona

countryName = Pais
countryName_value = ES

En aquest fitxer pots definir el contingut del CSR estalviant-te les preguntes interactives de openssl.

Així un cop tinguem el fitxer de configuració preparat podem executar la següent comanda per a generar la clau privada i el seu corresponent CSR:

$ openssl req -newkey rsa:2048 -keyout clau_privada.key -out el_meu_csr.csr -config openssl.conf

Això ens haurà demanat que introduïm una contrasenya per a protegir la nostra clau privada.

Un cop executada la comanda hauríem de tenir els següents fitxers al nostre directori:

$ ll
total 20
drwxrwxr-x  2 oriol oriol 4096 abr  9 22:30 ./
drwxr-xr-x 11 oriol oriol 4096 abr  9 22:17 ../
-rw-------  1 oriol oriol 1854 abr  9 22:37 clau_privada.key
-rw-rw-r--  1 oriol oriol 1050 abr  9 22:37 el_meu_csr.csr
-rw-rw-r--  1 oriol oriol  513 abr  9 22:26 openssl.conf

Per a verificar que el contingut del CSR que acabem de generar és el correcte podem executar la següent comanda:

$ openssl req -in el_meu_csr.csr -noout -text
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:97:4d:49:d5:dc:a1:e1:07:6e:7e:52:17:08:64:
                    07:53:07:36:ca:ee:dd:23:9c:63:e7:a6:01:1d:4c:
                    53:bf:ce:06:bc:7b:23:05:08:4b:30:a9:d7:6f:84:
                    c9:48:98:12:c0:aa:5a:5e:9c:20:89:49:07:96:1e:
                    64:ea:74:7e:ad:3e:ae:b8:ad:23:e3:9d:9c:bb:30:
                    07:1b:03:1a:cc:8e:33:4c:f2:5a:ae:6b:a3:91:d6:
                    37:6e:d8:d5:02:1d:bd:b2:51:51:71:7a:2b:20:ed:
                    6f:a9:d3:db:1a:d1:57:b0:26:86:68:d6:4d:23:9d:
                    cc:41:0b:e0:f9:e1:5e:00:13:d6:30:25:a5:b8:4f:
                    5a:12:de:c7:3c:75:04:68:a2:aa:01:70:9f:aa:0f:
                    15:bf:d3:64:54:14:46:5a:4a:10:1e:52:88:27:aa:
                    78:1d:19:23:24:1f:5a:14:2e:eb:24:23:a2:ed:1c:
                    75:34:bc:5c:d0:1d:35:81:49:07:b1:63:7b:7a:48:
                    fa:fb:ff:06:12:40:c7:32:c1:78:c4:71:7a:82:40:
                    18:e1:37:24:67:21:aa:ee:f6:e0:dd:f1:e6:a4:4b:
                    20:d8:ed:ad:8d:1b:a7:1e:37:dc:c7:f7:dd:db:b1:
                    a9:be:18:aa:1f:b0:23:93:8c:b9:fb:5c:1b:79:a0:
                    8b:49
                Exponent: 65537 (0x10001)
        Attributes:
            (none)
            Requested Extensions:
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        39:cc:71:00:18:44:b3:8a:95:26:56:b3:09:f0:51:d9:5e:cb:
        4a:df:ec:0c:aa:0b:df:28:d0:68:ae:62:3b:2e:3e:5a:d7:47:
        fa:22:95:bb:2d:67:0d:54:64:94:42:fa:8c:f0:a8:3d:0b:1d:
        c1:e5:2e:96:0c:89:40:3c:2c:26:13:78:7d:ca:27:76:b3:e0:
        dd:9f:7e:0c:cc:a8:7f:62:3a:71:ae:a2:0e:36:56:d8:f4:ad:
        b9:10:de:7f:f0:eb:be:79:c3:29:85:5a:6d:1a:4a:25:d4:82:
        9c:28:ab:30:18:c8:1d:46:65:20:2b:cd:58:a2:56:0a:3c:f8:
        ab:cb:a9:15:c6:40:17:fc:c5:e7:a7:d0:3b:41:a6:78:42:3e:
        c0:0a:98:5f:24:f4:c1:fd:b9:64:39:d9:92:8d:cc:7f:8e:6b:
        2e:e3:72:fa:79:94:75:ba:a5:48:d6:9b:15:26:a7:6b:da:48:
        c9:15:4c:12:b9:78:c5:d5:24:8c:d0:e0:77:ed:99:d7:0e:7b:
        a3:e8:00:ca:00:d4:46:ca:56:97:25:ec:b7:d6:a8:b4:80:55:
        ab:a2:09:49:e9:3a:52:b2:75:2e:e6:0a:02:fa:59:d0:5b:45:
        bc:f2:2b:dd:ec:e2:62:79:8d:a0:30:de:64:a5:b3:cc:1e:b6:
        2f:40:03:0a

Si el CSR està correctament generat l’haurem de fer arribar a la nostra CA de confiança perquè ens generin el certificat.

Visualitzar el contingut del certificat

Per a visualitzar el contingut de la part pública d’un certificat podem fer el següent:

$ openssl x509 -in certificate.crt -noout -text
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            3f:44:9c:df:f8:9b:d7:94:3e:0a:33:6a:1c:2d:89:21:18:fe:f7
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES
        Validity
            Not Before: Apr 10 20:19:48 2024 GMT
            Not After : Apr 10 20:19:48 2025 GMT
        Subject: CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:e0:1a:6f:be:10:fc:36:e1:1b:a3:2e:69:ed:68:
                    ...
                    b1:31:ac:57:5a:f1:14:b2:b8:93:b5:c7:d8:93:9a:
                    be:0f:91
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        42:f1:ce:59:cd:7c:11:03:1e:de:3b:e8:e3:85:a8:41:ac:b8:
        ...
        b0:91:40:df:b5:44:b3:8e

Si només vols veure el subject:

$ openssl x509 -in certificate.crt -noout -subject
subject=CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES

O el número de serie:

$ openssl x509 -in certificate.crt -noout -serial
serial=3F449CDFF89BD7943E0A336A1C2D892118FEF7

Unir certificat i clau privada en un PKCS#12

Quan tenim un certificat en format PEM i una clau privada, els podem unir en un sol fitxer en format PKCS#12.

Suposant que el certificat que ens proveeix la nostra CA és certificat.crt, la comanda per a unir-ho seria:

$ openssl pkcs12 -export -out el_meu_pfx.p12 -inkey clau_privada.key -in certificat.crt

Convertir PKCS#12 a PEM

Si el que volem és separar el nostre PKCS#12 per a obtenir-ne la clau privada i el certificat:

$ openssl pkcs12 -in el_meu_pfx.p12 -out certificat_amb_clau.pem -nodes

El fitxer resultant tindrà un contingut semblant al següent:

$ cat certificat_amb_clau.pem 
Bag Attributes
    localKeyID: 2D 60 7B F7 67 2B 8D 96 FF 42 7A AA 59 FA 94 41 85 29 74 9D 
subject=CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES
issuer=CN = bernado.cat, O = ACME S.A., OU = Desenvolupament, emailAddress = email@example.com, L = Barcelona, C = ES
-----BEGIN CERTIFICATE-----
MIIFljCCA34CEz9EnN/4m9eUPgozahwtiSEY/vcwDQYJKoZIhvcNAQELBQAwgYcx
FDASBgNVBAMMC2Jlcm5hZG8uY2F0MRIwEAYDVQQKDAlBQ01FIFMuQS4xGDAWBgNV
...
THzcKqIcG95z0WcW4HrJ3rnecEaMAHGb0bjcdHzOYfw5MXYjJlBXX3AhmRffKafw
B9t0MJKkTMtQatGwDcfbPeQFY/RmT2purw/czDWU8Gxgb7CRQN+1RLOO
-----END CERTIFICATE-----
Bag Attributes
    localKeyID: 2D 60 7B F7 67 2B 8D 96 FF 42 7A AA 59 FA 94 41 85 29 74 9D 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDgGm++EPw24Ruj
LmntaI25UScfkJfwmRjJJaJrOKNQIOqwmQkxuSjO2sdl4VDGzbS6Oa6+ktPWd9EK
...
hSsUm3wd0Z7CtVjkF1+gXzm4LGwsY0EbOCjl0VJSrlSwXyTr94GmiVZMUNI5N+Pt
gi8RNPZrWd6oabcKilMARBmVne3ugMY=
-----END PRIVATE KEY-----