Uno de mis artículos más visitados es Cómo crear tu propia autoridad certificante (CA), el cual explica cómo crear una Autoridad Certificante (conocida vulgarmente como "CA") utilizando OpenSSL, para crear certificados SSL autofirmados. En esta oportunidad voy a explicar cómo renovar certificados que han expirado o están próximos a expirar en GNU/Linux utilizando OpenSSL.
En el momento de firmar un certificado SSL, la autoridad certificante lo certifica (valga la redundancia) por un determinado período de tiempo de validez, por ejemplo un año o dos. Una vez pasado este tiempo, el certificado deja de ser válido y no puede ser utilizado para establecer comunicaciones seguras. Por lo tanto es común que los certificados expiren y deban ser renovados frecuentemente.
Para determinar si un certificado ha expirado es posible verificarlo utilizando el comando verify
:
# openssl verify -purpose sslserver -CAfile /CA/certificados/ca.crt /CA/certificados/wwwpepe.crt /CA/certificados/wwwpepe.crt: /C=AR/ST=Buenos Aires/L=Bahía Blanca/O=Pepe Inc./OU=IT/CN=www.pepe.com/emailAddress=admin@pepe.com error 10 at 0 depth lookup:certificate has expired OK
NOTA: Cada comando de OpenSSL posee su propia página de manual (manpage). Por ejemplo, para obtener información sobre el comando openssl verify
acceder a la página de manual "verify": man verify
.
Este comando requiere indicar la ruta al certificado de la CA, la cual se especifica mediante el parámetro -CAfile
. Tal como se observa en la salida del comando, el certificado verificado ha expirado. Por lo que, si está siendo utilizado por algún cliente o servicio, será necesario renovarlo.
También es posible volcar el contenido del certificado en texto plano mediante:
# openssl x509 -text -in /CA/certificados/wwwpepe.crt
Para comenzar se debe revocar el certificado expirado. Esto lo invalida completamente en la CA:
# openssl ca -config openssl.my.cnf -revoke certificados/wwwpepe.crt Using configuration from openssl.my.cnf Enter pass phrase for ./private/ca.key: Revoking Certificate 17. Data Base Updated
Para más información sobre el comando ca
abrir la manpage man ca
.
Una vez revocado, es posible verificar la base de datos (index.txt
). La letra 'R' al comienzo de la línea indica que el certificado ha sido revocado, en cambio 'V' indica que el certificado es válido:
# cat index.txt | grep " 17 " R 130666645661Z 136666156646Z 17 unknown /C=AR/ST=Buenos Aires/L=Bahía Blanca/O=Pepe Inc./OU=IT/CN=www.pepe.com/emailAddress=admin@pepe.com
Para crear un nuevo certificado con los mismos valores (mismo subject), volcar el contenido del certificado actual:
# openssl x509 -subject -issuer -enddate -noout -in /CA/certificados/wwwpepe.crt subject= /C=AR/ST=Buenos Aires/O=Pepe Inc./OU=IT/CN=www.pepe.com/emailAddress=admin@pepe.com issuer= /C=AR/ST=Buenos Aires/L=Bahía Blanca/O=Pepe Inc./OU=IT/CN=CA/emailAddress=admin@pepe.com notAfter=Dec 8 14:06:07 2013 GMT
A partir de estos valores, crear un nuevo certificado:
# openssl req -config openssl.my.cnf -new -nodes -keyout /CA/private/wwwpepe-2014.key -out /CA/wwwpepe-2014.csr -days 547 Generating a 1024 bit RSA private key ...++++++ .........++++++ writing new private key to '/CA/private/wwwpepe-2014.key' ----- 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) [AR]: State or Province Name (full name) [Buenos Aires]: Locality Name (eg, city) [Bahía Blanca]: Organization Name (eg, company) [Pepe Inc.]: Organizational Unit Name (eg, section) [IT]: Common Name (eg, YOUR name) []:www.pepe.com Email Address [admin@pepe.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Para que los servicios puedan levantar automáticamente sin problemas durante el inicio, es necesario remover la contraseña (passphrase) de la clave privada, para ello ejecutar:
# cd /CA/private/ # cp wwwpepe-2013.key wwwpepe-2013.key.org # openssl rsa -in wwwpepe-2013.key.org -out wwwpepe-2013.key writing RSA key
Finalmente, firmar el certificado (requiere la passphrase de la clave privada de la CA):
# openssl ca -config /CA/openssl.my.cnf -out /CA/certificados/wwwpepe-2014.crt -infiles /CA/wwwpepe-2014.csr Using configuration from openssl.my.cnf Enter pass phrase for /CA/private/ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 21 (0x21) Validity Not Before: Dec 10 16:25:53 2013 GMT Not After : Jun 10 16:25:53 2015 GMT Subject: countryName = AR stateOrProvinceName = Buenos Aires organizationName = Pepe Inc. organizationalUnitName = IT commonName = www.pepe.com emailAddress = admin@pepe.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 70:1B:11:AE:0A:B0:2B:AF:45:CD:8B:2F:19:3B:37:B0:31:AA:4C:89 X509v3 Authority Key Identifier: keyid:B0:34:24:2B:55:F8:7D:EE:B0:7A:84:1A:78:BF:C6:49:2D:A7:3A:C3 Certificate is to be certified until Jun 10 16:25:53 2015 GMT (547 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
Antes de utilizar el certificado recién firmado, es posible verificarlo:
# openssl x509 -subject -issuer -enddate -noout -in /CA/certificados/wwwpepe-2014.crt subject= /C=AR/ST=Buenos Aires/O=Pepe Inc./OU=IT/CN=wwwpepe-2014/emailAddress=admin@pepe.com issuer= /C=AR/ST=Buenos Aires/L=Bahía Blanca/O=Pepe Inc./OU=IT/CN=190.210.100.173/emailAddress=admin@pepe.com notAfter=Jun 10 16:25:53 2015 GMT
El certificado ya está listo para ser utilizado por cualquier servicio que requiera SSL. En el artículo Configuración de HTTPS en Apache explico como configurar SSL en el servidor Wen Apache, mientras que en el artículo Autenticar usuarios MySQL utilizando SSL explico cómo utilizar certificados SSL para autenticar usuarios de bases de datos MySQL.
Por otro lado, si queremos ser notificados con antelación antes de que expire un certificado, he creado un script bash para verificar fechas de expiración de certificados x.509. Se trata de un script Bash simple que monitorea la validez de los certificados emitidos por nuestra CA y envía un mail unos días antes de que expiren. Es muy útil para tener tiempo suficiente para renovar los certificados expirados y reconfigurar los servicios, antes de que se produzcan fallos.