miércoles, 12 de enero de 2022

Autoridad de Certificación con OpenSSL

Los certificados digitales usados por los servidores o usuarios deben estar firmados por una Autoridad de Certificación, en inglés Certificate Authority, comúnmente abreviado como CA. Existen muchas autoridades de certificación a las que podemos solicitar un certificado o también podemos crear nuestra propia autoridad para gestionar nosotros mismos los certificados. Utilizar nuestra propia CA tiene la desventaja de que no podremos gestionar adecuadamente la revocación de certificados en navegadores web, ya que estos han dejado o están en proceso de dejar de usar listas de revocación de certificados o servidores OCSP. En su lugar utilizan sus propios sistemas centralizados para que el proceso de validación de certificados sea más rápido y seguro.

Aún teniendo en cuenta la limitación de la revocación de certificados en navegadores, el crear nuestra propia CA nos puede ser útil en determinadas circunstancias, sobre todo para uso interno y software distinto a los navegadores. Crear nuestra propia CA también nos puede servir como ejercicio para comprender mejor el funcionamiento de los certificados digitales. A continuación voy a explicar como crear una CA con OpenSSL y firmar certificados para servidores y usuarios.

Si aún no lo tenemos instalado debemos instalar OpenSSL. Por seguridad es recomendable utilizar para la CA un ordenador que no usemos para otra cosa. Para aumentar más la seguridad lo podemos tener desconectado de la red.

# apt-get install openssl

Seguidamente debemos crear un directorio donde guardar los archivos de la CA. Por seguridad solo el usuario encargado de controlar la CA debe tener permisos en este directorio.

# mkdir /etc/ssl/ca -m 700

Una vez creado el directorio de la CA debemos crear dos subdirectorios para guardar los certificados y la clave privada de la CA.

# cd /etc/ssl/ca
# mkdir private newcerts

En el directorio de la CA es necesario crear también un archivo index.txt donde se mantendrá una lista de los certificados y un archivo serial donde se indica el número de serie del siguiente certificado.

# touch index.txt
# echo "01" > serial

En el archivo de configuración /etc/ssl/openssl.cnf hay que indicar la ruta del directorio creado. En este archivo también se configuran las características por defecto de los certificados y claves que crea openssl. Con el parámetro default_days podemos configurar el tiempo de validez de los certificados, no es recomendable que sea más de un año. El parámetro default_bits indica el tamaño por defecto de las claves privadas creadas durante una petición de certificado. Los parámetros se agrupan en secciones que comienzan con un nombre entre corchetes.

[ CA_default ]

dir = /etc/ssl/ca
default_days = 365

[ req ]

default_bits = 2048

Después de crear el directorio y modificar la configuración podemos crear la clave privada y el certificado de la CA. Con el parámetro -keyout podemos indicar el archivo de la clave privada y con el parámetro -out el archivo del certificado. El tamaño de la clave será el indicado en el parámetro de configuración default_bits. El parámetro -utf8 hace que se utilice codificación UTF-8 para poder usar caracteres no ASCII. El programa nos pedirá una contraseña para proteger la clave privada.

openssl req -new -x509 -days 3650 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -utf8

Generating a RSA private key
...+++++
......................................+++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Cuaderno Informática
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Cuaderno Informática CA
Email Address []:ca-admin@cuadernoinformatica.com

Al terminar la creación del certificado y clave privada podemos ver la información del certificado con el comando openssl. Primero se muestra una descripción del certificado y al final el propio certificado entre las etiquetas -----BEGIN CERTIFICATE----- y -----END CERTIFICATE-----. En el certificado va incluida la clave pública.

# openssl x509 -in cacert.pem -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            24:d1:83:43:c8:2a:54:e6:00:b7:ec:3a:6f:7c:a7:3b:a7:77:f4:58
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Madrid, L = Madrid, O = Cuaderno Inform\C3\A1tica, CN = Cuaderno Inform\C3\A1tica CA, emailAddress = ca-admin@cuadernoinformatica.com
        Validity
            Not Before: Jan 12 16:32:31 2022 GMT
            Not After : Jan 10 16:32:31 2032 GMT
        Subject: C = ES, ST = Madrid, L = Madrid, O = Cuaderno Inform\C3\A1tica, CN = Cuaderno Inform\C3\A1tica CA, emailAddress = ca-admin@cuadernoinformatica.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:af:2f:f7:21:4c:4b:53:59:4b:84:60:6b:a8:0e:
                    e1:39:3f:49:7c:14:80:25:47:f9:88:1d:9c:d7:5e:
                    d6:e2:c4:6a:10:01:d7:38:a9:dc:13:de:82:f1:88:
                    e1:2c:14:8d:33:a0:ff:7b:0f:69:41:04:5e:9d:b2:
                    c0:b1:05:2b:d3:ec:41:5c:4b:f9:94:dc:e8:ea:d1:
                    e8:b1:c3:b4:83:7c:d1:8a:55:0a:63:c0:85:23:5d:
                    dd:e7:fe:66:17:b2:49:70:9b:4e:d1:34:d2:5a:b0:
                    44:1a:73:46:b8:c7:2b:b7:09:ba:be:39:f3:16:ba:
                    d9:fe:9a:5c:f6:42:11:5e:c4:0f:ce:15:0e:ae:82:
                    2c:f6:14:3d:56:65:d9:da:52:12:c4:06:27:cf:22:
                    b0:7c:38:cc:ff:22:09:8c:84:2c:80:fe:46:98:9e:
                    ee:c0:52:b6:d1:45:da:0f:52:26:fa:e1:dc:ad:f9:
                    68:c6:4a:c6:31:bb:58:40:72:ec:3b:8f:87:f5:c9:
                    fc:61:07:4e:51:d0:d8:fb:0f:58:d2:e4:bf:2c:f3:
                    52:fe:e5:28:7a:3a:b1:88:e4:b0:fe:a8:90:67:b0:
                    26:92:1f:45:e1:8b:f5:53:cb:e5:f0:88:0b:49:80:
                    0f:76:6f:7a:3f:fa:b3:ac:d9:29:b6:d9:4c:ab:b2:
                    fe:f3
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                7D:9D:01:63:4F:99:26:16:82:3C:88:D8:9C:75:FC:85:82:A8:6A:41
            X509v3 Authority Key Identifier: 
                keyid:7D:9D:01:63:4F:99:26:16:82:3C:88:D8:9C:75:FC:85:82:A8:6A:41

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         67:24:b3:2f:86:d8:12:8f:0e:09:cd:46:61:27:5a:0e:13:29:
         a1:a7:be:e4:76:e5:33:de:7b:72:1d:c7:ec:ae:73:63:b1:b5:
         34:c7:c4:18:1e:95:6e:14:1c:83:f2:0a:2b:3c:78:d6:16:cf:
         ce:52:f8:06:6c:32:29:69:d4:b6:88:df:e9:cf:50:43:51:02:
         98:4d:16:10:99:14:32:ae:3e:99:af:97:f7:da:43:f7:b9:f0:
         78:50:0d:1f:de:ea:5b:0e:ac:92:92:1e:38:14:c5:74:01:f2:
         9f:b1:b1:65:ae:7c:1f:1f:76:aa:e9:ec:9a:21:14:c3:cf:5a:
         01:cd:75:39:09:30:eb:06:71:b2:89:80:29:16:02:68:25:a2:
         d2:c1:24:6b:6a:e5:12:45:04:bf:5e:48:93:84:9e:f8:d8:39:
         18:b2:0b:31:11:66:87:a2:e1:48:05:24:1a:2d:5d:01:3e:9b:
         98:c5:ae:25:41:d6:df:be:06:07:fd:ba:6b:47:41:e0:fd:11:
         bc:97:81:99:b6:fa:48:d0:0c:92:15:49:a2:fd:3b:fb:c5:4a:
         fa:57:2b:84:21:2a:d1:90:c7:3a:67:17:32:73:ad:bd:2f:a2:
         26:75:49:ee:04:05:97:db:70:ca:fc:20:91:7d:2f:83:30:53:
         3b:7d:4d:59
-----BEGIN CERTIFICATE-----
MIIEKTCCAxGgAwIBAgIUJNGDQ8gqVOYAt+w6b3ynO6d39FgwDQYJKoZIhvcNAQEL
BQAwgaMxCzAJBgNVBAYTAkVTMQ8wDQYDVQQIDAZNYWRyaWQxDzANBgNVBAcMBk1h
ZHJpZDEeMBwGA1UECgwVQ3VhZGVybm8gSW5mb3Jtw6F0aWNhMSEwHwYDVQQDDBhD
dWFkZXJubyBJbmZvcm3DoXRpY2EgQ0ExLzAtBgkqhkiG9w0BCQEWIGNhLWFkbWlu
QGN1YWRlcm5vaW5mb3JtYXRpY2EuY29tMB4XDTIyMDExMjE2MzIzMVoXDTMyMDEx
MDE2MzIzMVowgaMxCzAJBgNVBAYTAkVTMQ8wDQYDVQQIDAZNYWRyaWQxDzANBgNV
BAcMBk1hZHJpZDEeMBwGA1UECgwVQ3VhZGVybm8gSW5mb3Jtw6F0aWNhMSEwHwYD
VQQDDBhDdWFkZXJubyBJbmZvcm3DoXRpY2EgQ0ExLzAtBgkqhkiG9w0BCQEWIGNh
LWFkbWluQGN1YWRlcm5vaW5mb3JtYXRpY2EuY29tMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAry/3IUxLU1lLhGBrqA7hOT9JfBSAJUf5iB2c117W4sRq
EAHXOKncE96C8YjhLBSNM6D/ew9pQQRenbLAsQUr0+xBXEv5lNzo6tHoscO0g3zR
ilUKY8CFI13d5/5mF7JJcJtO0TTSWrBEGnNGuMcrtwm6vjnzFrrZ/ppc9kIRXsQP
zhUOroIs9hQ9VmXZ2lISxAYnzyKwfDjM/yIJjIQsgP5GmJ7uwFK20UXaD1Im+uHc
rfloxkrGMbtYQHLsO4+H9cn8YQdOUdDY+w9Y0uS/LPNS/uUoejqxiOSw/qiQZ7Am
kh9F4Yv1U8vl8IgLSYAPdm96P/qzrNkpttlMq7L+8wIDAQABo1MwUTAdBgNVHQ4E
FgQUfZ0BY0+ZJhaCPIjYnHX8hYKoakEwHwYDVR0jBBgwFoAUfZ0BY0+ZJhaCPIjY
nHX8hYKoakEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAZySz
L4bYEo8OCc1GYSdaDhMpoae+5HblM957ch3H7K5zY7G1NMfEGB6VbhQcg/IKKzx4
1hbPzlL4BmwyKWnUtojf6c9QQ1ECmE0WEJkUMq4+ma+X99pD97nweFANH97qWw6s
kpIeOBTFdAHyn7GxZa58Hx92qunsmiEUw89aAc11OQkw6wZxsomAKRYCaCWi0sEk
a2rlEkUEv15Ik4Se+Ng5GLILMRFmh6LhSAUkGi1dAT6bmMWuJUHW374GB/26a0dB
4P0RvJeBmbb6SNAMkhVJov07+8VK+lcrhCEq0ZDHOmcXMnOtvS+iJnVJ7gQFl9tw
yvwgkX0vgzBTO31NWQ==
-----END CERTIFICATE-----

Una vez creada la CA podemos generar una clave privada para un servidor o usuario en cualquier otro ordenador. Por seguridad la clave privada se puede cifrar con un algoritmo como AES con el parámetro -aes256.

# openssl genrsa -out privkey.pem 2048

Generating RSA private key, 2048 bit long modulus (2 primes)
..................................................................+++++
..........+++++
e is 65537 (0x010001)

Con la clave privada podemos crear una petición de firma de certificado, Certificate Signing Request (CSR) en inglés. El "Common Name" en el caso de un servidor es la dirección de internet y en el caso de un usuario el nombre y apellidos.

# openssl req -new -key privkey.pem -out certrequest.csr -utf8

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Cuaderno Informática
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.cuadernoinformatica.com
Email Address []:web@cuadernoinformatica.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

La petición de firma de certificado se debe enviar al ordenador de la CA para que sea firmada y se cree el certificado. Con el parámetro -out se indica el archivo de salida del certificado.

# openssl ca -in certrequest.csr -out cert.pem

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/ca/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 12 16:37:54 2022 GMT
            Not After : Jan 12 16:37:54 2023 GMT
        Subject:
            countryName               = ES
            stateOrProvinceName       = Madrid
            organizationName          = Cuaderno Inform\E1tica
            commonName                = www.cuadernoinformatica.com
            emailAddress              = web@cuadernoinformatica.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                8A:3A:17:80:2E:CC:8F:E9:35:FF:AD:6C:E8:06:DF:07:20:E6:AF:2D
            X509v3 Authority Key Identifier: 
                keyid:7D:9D:01:63:4F:99:26:16:82:3C:88:D8:9C:75:FC:85:82:A8:6A:41

Certificate is to be certified until Jan 12 16:37:54 2023 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Al igual que con el certificado de la CA podemos usar el comando openssl para ver los datos de los certificados de servidores o usuarios.

# openssl x509 -in cert.pem -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Madrid, L = Madrid, O = Cuaderno Inform\C3\A1tica, CN = Cuaderno Inform\C3\A1tica CA, emailAddress = ca-admin@cuadernoinformatica.com
        Validity
            Not Before: Jan 12 16:37:54 2022 GMT
            Not After : Jan 12 16:37:54 2023 GMT
        Subject: C = ES, ST = Madrid, O = Cuaderno Inform\C3\A1tica, CN = www.cuadernoinformatica.com, emailAddress = web@cuadernoinformatica.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:e2:e7:ca:79:48:22:86:e8:5a:9e:d7:d6:19:ce:
                    27:51:b1:7e:8d:f9:97:7f:bc:3e:94:1e:5e:66:e0:
                    98:06:cb:6a:03:3b:10:1b:69:03:8b:57:95:6c:b4:
                    51:e4:ab:f6:fc:4c:8d:0f:2d:ea:54:a2:05:f6:76:
                    c0:62:b0:42:97:ec:26:59:51:d3:0a:f9:84:aa:76:
                    f6:cd:d5:a9:74:d7:e0:84:fd:72:fe:34:e4:d0:47:
                    5b:85:13:bb:e9:eb:0f:de:9b:cd:c6:68:0b:60:10:
                    4d:cc:10:04:08:c5:bd:8f:1f:29:d6:62:25:5d:eb:
                    b1:d2:00:6d:ca:3a:ba:7f:10:1c:b0:f3:66:d0:9f:
                    86:aa:1f:a8:50:84:eb:82:38:2d:59:24:0d:3c:79:
                    80:13:64:8d:72:f5:9a:d4:4b:e7:c3:95:0b:01:a6:
                    35:bb:fe:5a:37:47:01:aa:4c:35:3d:f5:1c:db:e6:
                    19:7a:34:5f:61:cd:92:09:b9:3a:fc:4f:ba:04:da:
                    54:22:d1:9c:0d:f3:8d:d9:5e:70:70:be:7c:40:ee:
                    ae:e1:1e:44:ad:02:90:6b:47:fd:d8:da:23:14:c7:
                    f7:c8:f9:b9:a6:3f:3a:e5:4d:52:ce:a8:a7:0a:8a:
                    0e:1b:f0:0b:f5:2d:b0:0b:69:e5:2f:73:eb:7e:65:
                    89:ab
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                8A:3A:17:80:2E:CC:8F:E9:35:FF:AD:6C:E8:06:DF:07:20:E6:AF:2D
            X509v3 Authority Key Identifier: 
                keyid:7D:9D:01:63:4F:99:26:16:82:3C:88:D8:9C:75:FC:85:82:A8:6A:41

    Signature Algorithm: sha256WithRSAEncryption
         47:a3:7b:c7:6e:e9:99:ac:27:7d:78:0f:fb:12:12:2f:d8:51:
         f2:a4:e4:50:00:36:a4:c0:bf:b3:99:42:d6:67:62:d0:b1:91:
         a2:61:cc:d5:bb:a4:32:f4:9a:3f:85:75:32:a1:3f:d1:8e:64:
         bc:bc:4e:7c:7d:41:0c:66:a8:4a:7b:8d:39:05:06:92:af:a2:
         01:90:27:46:c9:e5:71:f3:32:35:9f:95:f9:ee:a1:e4:5f:46:
         ba:ea:e2:19:01:35:a0:e5:dc:51:55:fe:cb:11:41:f0:a8:46:
         93:92:a7:af:c0:bb:71:8d:99:2b:01:94:b3:9a:e6:3f:5a:5b:
         9b:de:ac:79:c1:33:06:d6:ba:0a:23:75:ee:64:bc:e0:06:76:
         fa:83:c1:7d:94:d6:5e:2c:ab:8a:af:7c:c5:67:31:2c:fe:ee:
         9c:9f:a8:ea:ef:87:6b:5b:99:72:00:03:1a:6f:68:e2:fc:b4:
         e4:e7:da:2a:17:83:09:bc:2f:62:07:0a:f7:3d:70:ad:96:e6:
         ee:45:be:11:a1:02:50:98:78:08:b0:bf:12:e8:6a:9d:1f:6f:
         11:0e:9d:bc:a7:32:58:57:96:6a:cc:06:f1:1e:7a:dc:c8:36:
         8a:ec:05:80:0d:63:6d:1c:bb:85:c4:4c:e1:ee:2d:b5:ef:4e:
         14:1c:b3:97
-----BEGIN CERTIFICATE-----
MIIEKzCCAxOgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCRVMx
DzANBgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFkcmlkMR4wHAYDVQQKDBVDdWFk
ZXJubyBJbmZvcm3DoXRpY2ExITAfBgNVBAMMGEN1YWRlcm5vIEluZm9ybcOhdGlj
YSBDQTEvMC0GCSqGSIb3DQEJARYgY2EtYWRtaW5AY3VhZGVybm9pbmZvcm1hdGlj
YS5jb20wHhcNMjIwMTEyMTYzNzU0WhcNMjMwMTEyMTYzNzU0WjCBkDELMAkGA1UE
BhMCRVMxDzANBgNVBAgMBk1hZHJpZDEeMBwGA1UECgwVQ3VhZGVybm8gSW5mb3Jt
w6F0aWNhMSQwIgYDVQQDDBt3d3cuY3VhZGVybm9pbmZvcm1hdGljYS5jb20xKjAo
BgkqhkiG9w0BCQEWG3dlYkBjdWFkZXJub2luZm9ybWF0aWNhLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOLnynlIIoboWp7X1hnOJ1Gxfo35l3+8
PpQeXmbgmAbLagM7EBtpA4tXlWy0UeSr9vxMjQ8t6lSiBfZ2wGKwQpfsJllR0wr5
hKp29s3VqXTX4IT9cv405NBHW4UTu+nrD96bzcZoC2AQTcwQBAjFvY8fKdZiJV3r
sdIAbco6un8QHLDzZtCfhqofqFCE64I4LVkkDTx5gBNkjXL1mtRL58OVCwGmNbv+
WjdHAapMNT31HNvmGXo0X2HNkgm5OvxPugTaVCLRnA3zjdlecHC+fEDuruEeRK0C
kGtH/djaIxTH98j5uaY/OuVNUs6opwqKDhvwC/UtsAtp5S9z635liasCAwEAAaN7
MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQg
Q2VydGlmaWNhdGUwHQYDVR0OBBYEFIo6F4AuzI/pNf+tbOgG3wcg5q8tMB8GA1Ud
IwQYMBaAFH2dAWNPmSYWgjyI2Jx1/IWCqGpBMA0GCSqGSIb3DQEBCwUAA4IBAQBH
o3vHbumZrCd9eA/7EhIv2FHypORQADakwL+zmULWZ2LQsZGiYczVu6Qy9Jo/hXUy
oT/RjmS8vE58fUEMZqhKe405BQaSr6IBkCdGyeVx8zI1n5X57qHkX0a66uIZATWg
5dxRVf7LEUHwqEaTkqevwLtxjZkrAZSzmuY/Wlub3qx5wTMG1roKI3XuZLzgBnb6
g8F9lNZeLKuKr3zFZzEs/u6cn6jq74drW5lyAAMab2ji/LTk59oqF4MJvC9iBwr3
PXCtlubuRb4RoQJQmHgIsL8S6GqdH28RDp28pzJYV5ZqzAbxHnrcyDaK7AWADWNt
HLuFxEzh7i21704UHLOX
-----END CERTIFICATE-----

Además de en el archivo de salida indicado el certificado también es copiado al directorio de la CA /etc/ssl/ca/newcerts/.

# ls -l /etc/ssl/ca/newcerts/

total 8
-rw-r--r-- 1 root root 4765 ene 12 17:38 01.pem

En el archivo /etc/ssl/ca/index.txt podemos ver como se ha añadido una entrada con la información del certificado.

# cat /etc/ssl/ca/index.txt

V	230112163754Z		01	unknown	/C=ES/ST=Madrid/O=Cuaderno Inform\xC3\xA1tica/CN=www.cuadernoinformatica.com/emailAddress=web@cuadernoinformatica.com

El valor del archivo /etc/ssl/ca/serial ha sido aumentado en uno, el siguiente certificado recibirá el número de serie "2".

# cat /etc/ssl/ca/serial

02

Para la autenticación de usuario mediante certificados podemos crear certificados de la misma forma poniendo en el "Common Name" el nombre y apellidos del usuario.

# openssl genrsa -out user-privkey.pem 2048
# openssl req -new -key user-privkey.pem -out user-certrequest.csr -utf8

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Cuaderno Informática
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Alejandro Sánchez
Email Address []:alejandro@cuadernoinformatica.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl ca -in user-certrequest.csr -out user-cert.pem

Las clave privada y certificado en formato PEM los podremos utilizar en multitud software pero en algunos casos necesitaremos exportarlos a un almacén de claves PKCS12. Por seguridad se nos pedirá una contraseña para cifrarlo.

# openssl pkcs12 -export -in cert.pem -inkey privkey.pem -out keystore.p12 -name cuadernoinformatica

Enter Export Password:
Verifying - Enter Export Password:

Por varios motivos podemos necesitar revocar un certificado:

  • Eliminar el acceso de un usuario a un servidor.
  • Renovar un certificado caducado o próximo a caducar.
  • Invalidar un certificado al que un atacante ha tenido acceso a su clave privada.

# openssl ca -revoke /etc/ssl/ca/newcerts/02.pem

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/ca/private/cakey.pem:
Revoking Certificate 02.
Data Base Updated

En el archivo index.txt podemos ver como la entrada del certificado tiene al inicio una "R" indicando que ha sido revocado y en la tercera columna la fecha de revocación.

# cat index.txt

V	230112163754Z		01	unknown	/C=ES/ST=Madrid/O=Cuaderno Inform\xC3\xA1tica/CN=www.cuadernoinformatica.com/emailAddress=web@cuadernoinformatica.com
R	230112164518Z	220112164845Z	02	unknown	/C=ES/ST=Madrid/O=Cuaderno Inform\xC3\xA1tica/CN=Alejandro S\xC3\xA1nchez/emailAddress=alejandro@cuadernoinformatica.com

Para que los servidores y usuarios tengan conocimiento de los certificados que han sido revocados podemos crear una Lista de Revocación de Certificados, en inglés Certificate Revocation List (CRL). Antes de ello hay que crear el archivo crlnumber con el número de serie de la siguiente lista a crear.

# echo "01" > /etc/ssl/ca/crlnumber
# openssl ca -gencrl -out crl.pem

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/ca/private/cakey.pem:

Al igual que con los certificados podemos usar el comando openssl para ver la información de la lista de revocación. En ella se muestran los números de serie de los certificados revocados.

# openssl crl -in crl.pem -text

Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = ES, ST = Madrid, L = Madrid, O = Cuaderno Inform\C3\A1tica, CN = Cuaderno Inform\C3\A1tica CA, emailAddress = ca-admin@cuadernoinformatica.com
        Last Update: Jan 12 16:52:40 2022 GMT
        Next Update: Feb 11 16:52:40 2022 GMT
        CRL extensions:
            X509v3 CRL Number: 
                1
Revoked Certificates:
    Serial Number: 02
        Revocation Date: Jan 12 16:48:45 2022 GMT
    Signature Algorithm: sha256WithRSAEncryption
         4c:48:30:6d:99:91:05:94:05:5d:c5:79:6a:c2:36:fe:e5:db:
         e4:42:bc:10:26:17:1a:6e:6c:e9:61:ad:2a:47:32:16:e7:73:
         61:41:a2:ef:ad:c4:62:c5:34:ab:3c:db:5f:e8:d6:74:ed:eb:
         66:54:5b:db:6d:d9:70:df:8d:09:66:65:ff:9e:0c:71:94:3b:
         5f:e9:03:24:74:9e:e1:93:35:72:59:88:5e:fd:ba:35:d8:d7:
         66:74:72:48:94:21:96:f2:84:05:e9:84:e4:ff:34:a1:93:73:
         32:bd:61:d4:6f:6a:03:f8:9d:41:97:1d:76:03:45:1d:40:41:
         8e:c3:4a:93:c5:a6:19:90:42:3e:53:c6:90:27:b8:12:03:4d:
         94:22:74:d6:fb:06:4a:f5:50:19:8e:39:b7:42:9b:99:f1:59:
         3f:ec:d1:66:ee:ba:a3:5c:42:d8:a6:7f:f2:04:59:63:16:49:
         c0:1d:18:ee:ce:13:a5:6c:63:ae:ea:4d:08:36:b6:f3:87:2b:
         d2:98:b5:57:4e:db:e7:9c:ad:a4:3e:36:1c:d4:f8:86:b1:4e:
         0b:fa:b1:5b:94:8f:43:9a:89:65:8e:80:78:43:f5:41:6b:fe:
         df:e8:a3:4b:f4:e1:ef:5a:1b:06:a4:62:9b:df:38:54:38:53:
         8a:4b:d2:fa
-----BEGIN X509 CRL-----
MIICEzCB/AIBATANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCRVMxDzANBgNV
BAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFkcmlkMR4wHAYDVQQKDBVDdWFkZXJubyBJ
bmZvcm3DoXRpY2ExITAfBgNVBAMMGEN1YWRlcm5vIEluZm9ybcOhdGljYSBDQTEv
MC0GCSqGSIb3DQEJARYgY2EtYWRtaW5AY3VhZGVybm9pbmZvcm1hdGljYS5jb20X
DTIyMDExMjE2NTI0MFoXDTIyMDIxMTE2NTI0MFowFDASAgECFw0yMjAxMTIxNjQ4
NDVaoA4wDDAKBgNVHRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEATEgwbZmRBZQF
XcV5asI2/uXb5EK8ECYXGm5s6WGtKkcyFudzYUGi763EYsU0qzzbX+jWdO3rZlRb
223ZcN+NCWZl/54McZQ7X+kDJHSe4ZM1clmIXv26NdjXZnRySJQhlvKEBemE5P80
oZNzMr1h1G9qA/idQZcddgNFHUBBjsNKk8WmGZBCPlPGkCe4EgNNlCJ01vsGSvVQ
GY45t0KbmfFZP+zRZu66o1xC2KZ/8gRZYxZJwB0Y7s4TpWxjrupNCDa284cr0pi1
V07b55ytpD42HNT4hrFOC/qxW5SPQ5qJZY6AeEP1QWv+3+ijS/Th71obBqRim984
VDhTikvS+g==
-----END X509 CRL-----

Una vez que tenemos los archivos de claves y certificados creados los podemos usar en el software servidor y cliente. Por ejemplo en Tomcat podremos usar los archivos PEM en un conector dentro de SSLHostConfig. Los parámetros certificateFile y certificateKeyFile indican el certificado y la clave privada. Los parámetros caCertificateFile y certificateVerification sirven para configurar la autenticación de los usuarios mediante certificados firmados por la CA. certificateRevocationListFile indica la lista de certificados de usuario revocados.

<SSLHostConfig
   caCertificateFile="/etc/tomcat/cacert.pem
   certificateVerification="required"
   certificateRevocationListFile="/etc/tomcat/crl.pem">

   <Certificate
      certificateFile="/etc/tomcat/cert.pem"
      certificateKeyFile="/etc/tomcat/privkey.pem" />
</SSLHostConfig>

Para que el software cliente confíe en el certificado del servidor creado con nuestra CA es necesario importar en el software cliente el certificado de la CA como uno de los certificados de autoridades de certificación en las que debe confiar. Para ello primero debemos copiar el archivo cacert.pem al ordenador cliente. Cada software cliente puede tener un método distinto para la importación, por ejemplo en Firefox debemos entrar en Menú -> Preferencias -> Privacidad & Seguridad -> Certificados -> Ver certificados -> Autoridades -> Importar, seleccionar el archivo cacert.pem y marcar los propósitos para los que se va a confiar en la CA.

Para usar un certificado de usuario en Firefox es necesario exportar la clave privada y el certificado a un almacén de claves PKCS12.

# openssl pkcs12 -export -in user-cert.pem -inkey user-privkey.pem -out user-keystore.p12 -name cuadernoinformatica

Este archivo lo podemos importar en Firefox entrando en Menú -> Preferencias -> Privacidad & Seguridad -> Certificados -> Ver certificados -> Sus certificados -> Importar y seleccionando el archivo user-keystore.p12. Debemos asegurarnos de que el usuario tiene permisos de lectura sobre el archivo PKCS12.

Para los programas que utilicen listas de revocación de certificados podemos publicar la lista en un servidor web. En los certificados se puede indicar la dirección de la lista mediante la extensión "X509v3 CRL Distribution Points". Para que al crear los certificados se añada esta extensión con la dirección de la lista es necesario indicarlo en el parámetro crlDistributionPoints del archivo de configuración /etc/ssl/openssl.cnf.

[ usr_cert ]

crlDistributionPoints = URI:http://www.cuadernoinformatica.com/crl.pem

# openssl x509 -in cert.pem -text

...

X509v3 extensions:
            
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://www.cuadernoinformatica.com/crl.pem

...

Estas son las instrucciones elementales para crear y utilizar una autoridad de certificación. Para casos concretos puede ser necesario que los certificados tengan algún tipo de información adicional.

No hay comentarios:

Publicar un comentario