Crear certificados digitales en Windows

Este manual se podría decir que es una actualización del artículo wiki crear e instalar certificados digitales en Apache HttpServer.

Lo primero que debemos hacer es descargarnos la distribución de OpenSSL para Windows. Para los que no lo sepan y parafraseando a la Wikipedia decir que OpenSSL es un software open source para libre descarga que incluye un paquete de herramientas de administración y bibliotecas relacionadas con la criptografía, que suministran funciones criptográficas a otros paquetes como OpenSSH y navegadores web para acceso seguro a sitios con el protocolo HTTPS, herramientas que ayudan al sistema a implementar el Secure Sockets Layer (SSL).

Una vez que hemos descargar OpenSSL debemos ejecutar el Símbolo del sistema y navegar hasta la ruta de instalación de este programa. Esto es muy importante porque de hacerlo desde otras carpetas nos puede dar un error del tipo 'openssl' is not recognized as an internal or external command, operable program or batch file.

Una vez en el símbolo del sistema escribimos:

cd OpenSSL-Win32
cd bin

Nota: en mi caso he instalado OpenSSL en el directorio C:\OpenSSL-Win32 y el ejecutable siempre se encuentra en el subdirectorio bin.

Ahora debemos crear una par de claves para el servidor. Una será la clave privada y la otra la pública.

openssl genrsa -des3 -out server.key 1024 -config "C:\OpenSSL-Win32\bin\openssl.cfg"

Muy importante la opción config porque en la instalación para Windows el archivo de configuración se encuentra en esta ruta y no donde lo busca el comando, no es necesario especificarlo en todos los comandos de este tutorial, solo en los que lo pongo de manera explícita, de no encontrarlo produce un error grabe del tipo Unable to load config info from /usr/local/ssl/openssl.cnf.

Este comando produce el fichero server.key con las dos claves como salida. Durante el proceso nos pedirá una clave para encriptar ese fichero, de forma que las claves no sean visibles.

WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

El siguiente paso es crear una solicitud de certificado.

openssl req -new -key server.key -out server.csr -config "C:\OpenSSL-Win32\bin\openssl.cfg"

Aún escribiendo la ruta del archivo de configuración recibimos el WARNING: can't open config file: /usr/local/ssl/openssl.cnf, omitirlo esto no importa.

En este comando anterior debemos indicar cual es nuestro fichero de claves generado en el paso anterior y dar los datos que queremos que aparezcan en el certificado.

Enter pass phrase for server.key:
Loading 'screen' into random state - done
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) [AU]:ES
State or Province Name (full name) [Some-State]:MADRID
Locality Name (eg, city) []:MADRID
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA
Organizational Unit Name (eg, section) []:DESARROLLO
Common Name (eg, YOUR name) []:dominio.es
Email Address []:desarrollo@dominio.es
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []: clave
An optional company name []:Empresa SL
Cuando instalemos todo esto en nuestro servidor Apache, vamos a poner el fichero de claves que hemos generado server.key. Puesto que está encriptado, cuando Apache arranque nos pedirá la clave del fichero. Esto es bastante incómodo sobre todo si pretendemos que Apache arranque automáticamente al arrancar el servidor. Por ello y aunque supone un riesgo, desencriptamos el fichero para ponerlo más adelante donde Apache vaya a usarlo.
Primero nos creamos una copia de seguridad del archivo server.key por lo que pueda pasar:

move server.key server.key.seguro

El comando para desencriptar el server.key es el siguiente:

openssl rsa -in server.key.seguro -out server.key
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Enter pass phrase for server.key.seguro:
writing RSA key

Una vez hecha la solicitud dos pasos antes, toca el momento de firmarla aunque en nuestro caso lo que haremos será autofirmar el certificado con nuestro propio certificado.

Esta es la opción más sencilla pero tened en cuenta que los navegadores protestarán:

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Loading 'screen' into random state - done
Signature ok
subject=/C=ES/ST=MADRID/L=MADRID/O=EMPRESA/OU=DESARROLLO/CN=dominio.es/emailAddress=desarrollo@dominio.es
Getting Private key
El -days 365 indica el tiempo de validez del certificado. La opción -signkey server.key es la que indica que el certificado debe ir autofirmado usando el fichero de claves server.key que generamos en el primer paso. Nuestro fichero de certificado será server.crt.
Si lo que queremos es firmarlo con nuestro propio certificado de autoridad de confianza entonces debemos consultar el manual original que viene muy bien explicado, teniendo en cuenta el comando config de OpenSSL.

De esta forma ya tenemos nuestros archivos con el certificado digital que hemos creado, en el manual de origen que os he puesto al principio de la web vienen muy bien explicados los pasos para instalarlo en un servidor web como apache.

Comentarios

Unknown ha dicho que…
Gracias! Muy buen blog!
Unknown ha dicho que…
Este comentario ha sido eliminado por el autor.
Anónimo ha dicho que…
Lo fácil que es crear un cert para un SFTP y lo que se complica el certificado y el OpenSSL para el webserver.

No me ha quedado claro si lo de "desencriptar" el certificado es un proceso o un apaño, pues dudo mucho que los servidores "en producción" que hay por ahí tengan un surtido de keys desencriptadas para poder iniciar el servidor con sus debidos certificados.

¿Lo he entendido mal? ¿Hay una manera de hacer que cargue bien el cert de otra manera?

Muchas gracias!
Reynier ha dicho que…
Ni idea, siento no ser de mucha ayuda, de esto hace más de un año.
Anónimo ha dicho que…
Man y si se quiere que a ese sitio web solo puedan ingresar los que tengan la llave publica como seria?
Atoio ha dicho que…
Ami me aparece al instalar el certificado en el navegador:
Error de autenticación basada en certificado.

alguna solucion?
Atoio ha dicho que…
este es el error
http://sia1.subirimagenes.net/img/2014/02/28/140228120049733949.png

es como si el certificado cliente no fuera valido pero lo estoy haciendo bajo los mismos pasos de ahi.
Unknown ha dicho que…
Un certificado SSL es una medida de seguridad necesaria y esencial a la hora de proteger el tráfico web y la información de sus clientes. El certificado de seguridad SSL asegura a los visitantes de su página Web que nadie puede ver, interceptar ni alterar los datos que son enviados y recibidos a través de su web.
Existen varios tipos de certificados SSL según el método de autentificación que se use.
Verificación de Dominio: Se validará que el dominio para el cual se emitirá el certificado ssl se encuentra registrado por el solicitante.
Verificación de Organización: También se verificará que la información emitida para el certificado (nombre, ciudad, provincia, pais) sean datos verdaderos.
Verificación Extendida: Además de las anteriores validaciones, se comprobará la existencia legal de la organización y que la misma aprueba la emisión del certificado.
Los certificados solo sirven para un único dominio o subdominio, para varios subdominios se deben usar certificados llamados Wildcard.