lunes, 28 de septiembre de 2015

Error TXT DB 2 al generar certificados con easy-rsa

Recientemente estaba generando una lista de certificados digitales para un lote de routers que se van a desplegar, con tan mala suerte que en la lista de seriales de los routers habían 3 duplicados (justo al final y con diferentes nombres). Para la generación de los certificados utilizo como "Common Name (CN)" el serial del aparato, cual es mi sorpresa cuando casi al terminar, generando los últimos 3 me encuentro con el siguiente error:

"failed to update database TXT_DB error number 2"

Primera vez que observo tal error, y para colmo de males, el certificado parecía haberse creado, revisando el directorio donde los almaceno aparecían los mismos, me aventure a pensar que fue un error del sistema al procesarlos y que, con solo borrarlos y recrearlos todo estaría bien. Para mi desgracia al hacer esto ultimo, aparecía el mismo error de nuevo, googleandolo observo que este error solo lo arroja cuando se intenta crear un certificado cuyo CN ya esta registrado y la única forma de solventar esto es o revocando el certificado o esperando que expire (en 12 años en este caso). 

Pues nada hago el procedimiento estándar para revocar un certificado:

./revoke-full CN

Y me arroja un error diciendo que el certificado no se encuentra... Para los que no lo saben (yo no lo sabia) no se puede revocar un certificado digital sin tener el .crt (los cuales yo borre previamente) - Habiéndolo borrado desde la consola de Linux con rm, realmente mis esperanzas de recuperarlos eran pocas, y necesitaba tener esos certificados con el CN = Serial del router, dado que utilizo un script para autoconfigurar todos los routers y ellos descargan sus certificados de forma automática basándose en el serial así que utilizar otro CN no era una opción valida.

Resumiendo la solución, cuando se genera un certificado, se genera también un respaldo del archivo .crt con extensión .pem, solo que el nombre del mismo no concuerda con el CN (el nombre son unos caracteres HEX) y para poder ubicarlo entonces hay que revisar un archivo llamado index.txt (ubicado también en la carpeta keys). Los pasos son:

  • Abrimos el archivo index.txt de izquierda a derecha, hay 4 campos, primero una V o R (Valid o Revoked), siguiendo una serie de números, luego caracteres hex y por ultimo una linea larga que describe todo el certificado
  • Linea a linea buscamos y ubicamos el certificado cuyo CN concuerda con el .crt que borramos (dentro de la linea larga con la descripción del certificado)
  • El tercer campo (los caracteres HEX) nos dice el nombre del archivo .pem que es respaldo del .crt
  • Copiamos el archivo .pem que recién ubicamos en el mismo directorio pero colocando como nombre el CN y la extensión .crt 
  • Ahora si podemos utilizar ./revoke-full CN y funcionara
  • Borramos el .crt (nuevamente)

Ejemplo:

V       29000020045Z           15      unknown /C=MX/ST=SO/L=Hermosillo/O=pagina.com/OU=Conektame/CN=1000010B/name=servidor/emailAddress=correo@correo.com

En negrita están los datos que nos interesa, primero los caracteres HEX que identifican el archivo .pem y luego el CN que identifica el certificado. 

Tendríamos entonces que copias el archivo 15.pem a 1000010B.crt

De todo esto, solo recordar que:
  • Para revocar un certificado es necesario el .crt del mismo
  • los archivos .pem con copias de los archivos .crt generados 
  • Es conveniente hacer respaldos de todos los certificados y tenerlos en sitios diferentes para evitar inconvenientes como este en el futuro 
  • Si les da el error antes mencionado, recuerden, es porque ya generaron un certificado con ese CN