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.


Tal vez pueda interesarte


Compartí este artículo