lunes, 13 de agosto de 2007

Certificados X509 para Apache 2 (I): Clave de la Autoridad Certificadora

PUBLICADA, PERO PENDIENTE DE MEJORAR EL FORMATO (no habrá cambios de contenido, salvo correcciones)



Bueno, a ver cómo van las cosas. Llegas un día y decides que quieres cambiar de protocolo: tu servidor Apache, con la costumbre de escuchar por el puerto 80 (HTTP), quieres que se ponga a escuchar en el puerto 443 (SSL) para usar eso que llaman el "protocolo HTTPS".

En una relación cifrada cliente-servidor como esa normalmente hay tres partes implicadas, no dos. Está el cliente, que no tiene motivos para confiar en el servidor, está el servidor, que no tiene motivos para confiar en el cliente, y está la Autoridad Certificadora. Así, con mayúsculas. Y la idea es que tanto el cliente como el servidor confían en la Autoridad Certificadora. Así, si el servidor presenta al cliente un documento de identidad certificado por la Autoridad Certificadora, el cliente puede estar seguro de que el servidor es quien realmente dice ser, y no un impostor.

Por eso, el papel de la Autoridad Certificadora es tan importante. Si he de meter mi número de tarjeta de crédito para hacer un pago en una página, quiero estar seguro de que el servidor que lo va a recibir es quien dice ser, y estoy seguro si mi navegador me dice que lo es.

Mi navegador me lo dice si el servidor se identifica mediante un certificado firmado por una Autoridad Certificadora en la que confíe. Y los navegadores confían en unas pocas Autoridades Certificadoras que tienen un negocio enorme con la venta de certificados. Evidentemente, los navegadores no confiarán en los certificados de cualquier autoridad certificadora, ya que cualquier ladrón informatizado que falsee una página puede falsear también su certificado creando una autoridad certificadora falsa.

Así que si no quieres pagar los 1500 (sí, mil quinientos) dólares que Verisign[1] u otros piratas semejantes cobran por un certificado, o si simplemente tienes algún motivo para convertirte en tu propia CA (Certificating Authority - Autoridad Certificadora), puedes hacerlo sin demasiados problemas (igual que lo haría el falsificador). Ten en cuenta que un servidor con SSL no funcionará sin un certificado.

Sólo necesitas tener instalado el paquete openssl, que proporciona las piezas y programas necesarios.

Crear la clave maestra de la CA


Lo primero es pensar en dónde almacenaremos todos los ficheros sensibles que vamos a crear. Lo ideal sería que creáramos un directorio sólo para esas cosas, con permisos adecuados, y que nos metiéramos en él antes de empezar a trabajar.

EDITO: He mejorado estas órdenes en una nueva entrada.

Nota: los comandos introducidos a partir de ahora son válidos en un sistema operativo de tipo UNIX, en particular yo los he probado en Linux, en la distribución Debian.

Antes de crear la clave crearemos un directorio llamado private para almacenar en él la clave privada:
mkdir private

A continuación creamos la clave:
openssl genrsa -des3 -out private/cakey.pem 2048

El comando openssl es la base de todo nuestro trabajo. Tiene un buen número de subcomandos para diferentes tareas. En esta ocasión utilizamos el subcomando genrsa para, precisamente, generar una clave RSA. Las opciones indican, por ese orden, que la clave generada estará protegida mediante un cifrado 3DES con contraseña (-3des) y que se almacenará en el directorio private en el fichero cakey.pem (-out private/cakey.pem), mientras que el argumento 2048 indica que la clave generada tendrá 2048 bits de longitud. La clave se almacenará en formato PEM, por eso ponemos la extensión como .pem, mientras que el nombre cakey indica, literalmente, que se trata de la clave de la CA. Esa es, además, la razón (aparte de que lo recomienda la documentación) de que la guardemos en el directorio private.

En la documentación oficial de OpenSSL se detalla que el subcomando genrsa es obsoleto y se debería usar en su lugar el subcomando genpkey, en cuyo caso la línea de órdenes sería:
openssl genpkey -des3 -outform PEM -out private/cakey.pem -pkeyopt rsa_keygen_bits:2048

Ojo: No he probado esta línea.

Bueno, en cualquier caso, como hemos pedido que la clave quede protegida mediante contraseña, tendremos que introducir la contraseña elegida, y volverla a introducir para confirmar que la hemos escrito bien:
openssl genrsa -des3 -out private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
..........................................+++
.............................................+++
e is 65537 (0x10001)
Enter pass phrase for private/cakey.pem:
Verifying - Enter pass phrase for private/cakey.pem:

Como se puede ver, el generador nos indica que está creando una clave privada RSA de 2048 bits, con el exponente 65537, lo que es un dato técnico que no nos importa ahora.

¿Y qué son todos esos puntitos y cruces? Pues muy sencillo: hay que encontrar dos números primos, y se prueban números al azar a ver si lo son. Cada puntito es un número probado que pasa una prueba de primalidad sencilla, y cada cruz es un número que pasa una prueba mayor. El salto de línea es un número que pasa todas las pruebas, es decir, que es uno de los dos números primos que estamos buscando.

Ojo: no pierdas nunca la contraseña que has introducido para cifrar la clave privada de la CA. Sin esa contraseña, toda la estructura de la CA queda inutilizada.

Seguiré en otro artículo con la creación del certificado raíz, la creación de la clave del servidor y la creación del certificado del servidor.

2 comentarios:

Anónimo dijo...

Para cuando la parte 2, y la parte tres, que hable de los certificados de clientes???

Envite dijo...

Sí, tengo que ponerme. En aquel momento necesitaba hacer esta parte y, ya que la hice, la escribí. Y no tuve necesidad de volver sobre el tema. Pero me acabas de volver a meter el gusanillo.