Creando certificados X.509 caducados

Expired Certificate

Ayer hice una presentación sobre TLS para desarrolladores, bueno más bien un taller, y uno de los ejercicios consistía en ejecutar un servicio con un certificado caducado para hacer algunas pruebas.

Para ello tenía que crearme un certificado caducado, y yo que soy muy listo, me dije nada, cuando cree al certificado lo pongo el número de días de caducidad en negativo y listo. Así, si queremos crear un certificado que caducó hace 5 días:

openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days -5
req: Non-positive number "-5" for -days
req: Use -help for summary.

Pues eso, que al final no soy tan listo :D

Así que a buscar se dijo. La mayoría de las soluciones que encontré requerían el cambio de la fecha del sistema por una fecha pasada y luego generando el certificado pasándole el número de días de su caducidad, que obviamente, sumando dicho valor a la fecha de sistema no pasara la fecha actual.

La verdad que la idea de cambiar la fecha del sistema pues no me hacía mucha gracia, pero luego pensé, bueno si lo hago desde un contenedor ¿Qué más da? Así que levanté un contendor con ubuntu y ejecuté el comando date:

docker run -it --rm ubuntu:18.04
root@c09ad5d2689d:/# date +%Y%m%d -s "20200101"
date: cannot set date: Operation not permitted
20200101
root@c09ad5d2689d:/#

Otro batacazo :(. Claro esto tiene sentido. Los miles que os habéis leído el libro de Docker: SecDevOps XD sabréis que un contenedor Docker no es más que un proceso más en el sistema, y éste comparte el mismo reloj. Por lo tanto cambiar la fecha en el contenedor cambiaría también la fecha del sistema, además para ello, tendrías que correr el contenedor con privilegios elevados (–privileged).

Volviendo a la casilla cero, la idea era el no cambiar la fecha del sistema, así que después de seguir buscando una solución al problema, finalmente encontré una utilidad llamada faketime. Esta utilidad de acuerdo a la documentación, es una simple capa encima de la librería libfaketime. Dicha librería permite la modificación de la fecha para una aplicación sin afectar al sistema. Esta librería intercepta algunas llamadas del sistema y faketime haciendo uso de LD_PRELOAD nos permite establecer la fecha y la hora para una aplicación específica.

Por lo tanto, ejecutando el siguiente comando:

faketime '2020-01-01' openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 1

Creamos un certificado cuya validez va desde el 1 de enero al 2 de enero del 2020. Verifiquémoslo:

openssl x509 -in server.crt -text -noout

...
    Validity
        Not Before: Jan  1 00:00:05 2020 GMT
        Not After : Jan  2 00:00:05 2020 GMT
...

faketime acepta varias formas de especificar la fecha como puede observarse en la documentación:

faketime 'last Friday 5 pm' /bin/date
faketime '2008-12-24 08:15:42' /bin/date
faketime -f '+2,5y x10,0' /bin/bash -c 'date; while true; do echo $SECONDS ; sleep 1 ; done'
...
...

Si quieres probarlo por ti mismo, puedes instalártela o puedes crearte un contenedor Docker. Para ello o bien te creas la imagen de forma manual, o puedes usar doig:

doig -u -i mytools -t faketime

Y luegos ejecutas el contenedor:

docker run -it --rm mytools

Por cierto si quieres jugar con “certificados con problemas”, https://badssl.com es un gran recurso.