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 []:[email protected]
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-----.
# 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 = [email protected] 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 = [email protected] 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 []:[email protected] 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 = [email protected] 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 = [email protected] 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 = [email protected] 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/[email protected]
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 []:[email protected] 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/[email protected] R 230112164518Z 220112164845Z 02 unknown /C=ES/ST=Madrid/O=Cuaderno Inform\xC3\xA1tica/CN=Alejandro S\xC3\xA1nchez/[email protected]
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 = [email protected] 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.