Crear e instalar certificados digitales en Apache HttpServer

De ChuWiki
Saltar a: navegación, buscar

Introducción

En nuestro servidor Apache podemos querer ofrecer una conexión segura https. Podemos incluso querer que sólo determinados usuarios puedan conectarse y ver nuestras páginas. Todo ello podemos hacerlo a base de certificados digitales. Un certificado digital instalado en nuestro servidor Apache permite que ofrezcamos las páginas con https. También podemos obligar a los navegadores de los usuarios a presentar un certificado digital para mostrarles o no las páginas. Veamos aquí cómo hacerlo.


Instalación de OpenSSL

Para crear el certificado digital necesitamos una herramienta que nos permita hacerlo. Una bastante extendida es OpenSSL. Nos podemos bajar los fuentes de OpenSSL de dicha página. Aquí http://www.openssl.org/related/binaries.html tenemos una distribución de binarios para windows y para linux podemos usar los gestores de paquetes, estilo

sudo apt-get install openssl


Creación de un certificado digital para el servidor

Una vez instalado OpenSSL y teniendo sus binarios en el path de búsqueda de ejecutables, podemos crear el certificado para el servidor. Abrimos una ventana de comandos y ejecutamos los siguientes pasos

Creación del par de claves

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

C:\> openssl genrsa -des3 -out server.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
...........................++++++
.............................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

Por supuesto podemos mirar las opciones y cambiarlas a nuestro gusto. La salida será un fichero server.key (o el nombre que queramos darle) con las dos claves. Durante el proceso nos pedirá una clave para encriptar ese fichero, de forma que las claves no sean visibles.

Crear solicitud del certificado

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

C:\>openssl req -new -key server.key -out server.csr
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) []:ALCALA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CHUIDIANG
Organizational Unit Name (eg, section) []:EJEMPLOS
Common Name (eg, YOUR name) []:chuidiang.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

En el proceso nos pedirá la clave con la que encriptamos anteriormente el fichero de claves. Los datos país, provinicia, ciudad, empresa, departamento, etc. En nuestro caso podemos poner lo que queramos puesto que vamos a hacer nosotros todo el proceso. Si el certificado pretendemos que sea oficialmente reconocido, debemos aportar datos reales. Puesto que nuestro certificado va a ser para un servidor web, es importante que en el campo "Common Name" pongamos el dominio o subdominio real de nuestro servidor, en el ejemplo "chuidiang.com".

Desencriptar el fichero de claves

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. El comando para ello es

C:\>move server.key server.key.seguro
Se han movido         1 archivos.

C:\>openssl rsa -in server.key.seguro -out server.key
Enter pass phrase for server.key.seguro:
writing RSA key

Hemos renombrado el fichero server.key a server.key.seguro para conservar intacto el fichero de claves encriptado. Luego el comando openssl rsa lo desencripta y nos lo guarda en server.key. Por supuesto, los nombres de fichero podemos ponerlos a nuestro gusto.

Autofirmar el certificado

Una vez hecha la solicitud dos pasos antes, toca el momento de firmarla. Aquí tenemos tres opciones posibles:

  • Enviar la solicitud a una autoridad de confianza para que nos la firme (por ejemplo, http://www.verisign.es/) . Esta es la opción si queremos que nuestro certificado sea oficial y que el navegador no de un aviso de "certificado inseguro" cuando el usuario visite nuestra página Web. Se supone que la autoridad de confianza debe verificar que los datos aportados son reales, nos firmarán el certificado y nos cobrarán por ello.
  • Crear nuestro propio certificado de autoridad de confianza (que realmente no lo será puesto que lo hemos hecho nosotros mismos) y firmar nuestro certificado con ese que hemos creado. Si no queremos que el navegador de nuestros visitantes proteste, debemos entregarles el certificado de la autoridad de confianza que hemos creado y pedirle que lo instalen en sus navegadores. Esta opción puede ser adecuada si nuestra página va a tener un número de usuarios conocido y limitado, por ejemplo, en una intranet.
  • Autofirmarnos el certificado con nuestro propio certificado. Esta es la opción más sencilla y la que vamos a emplear. Los navegadores protestarán, pero nos sirve para aprender y hacer nuestras pruebas.

El comando a usar es

C:\>openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Loading 'screen' into random state - done
Signature ok
subject=/C=ES/ST=MADRID/L=ALCALA/O=CHUIDIANG/OU=EJEMPLOS/CN=chuidiang.com
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.

Crear nuestra propio certificado de autoridad de confianza

La otra opción era crear nosotros mismos un certificado de autoridad de confianza para firmar el certificado del servidor. Veamos cómo hacerlo. Primero creamos el certificado de la autoridad de confianza con el siguiente comando

C:\>openssl req -x509 -newkey rsa:2048 -keyout ca.key -days 3650 -out ca.crt
Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
......................................................+++
.......+++
writing new private key to 'ca.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) []:ALCALA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CHUIDIANG
Organizational Unit Name (eg, section) []:CA
Common Name (eg, YOUR name) []:org.chuidiang
Email Address []:

Al ejecutar el comando nos pedirá una clave para encriptar el fichero de claves. Hemos puesto validez del certificado 10 años (-days 3650) y hemos ido rellenando los datos que nos pide al ejecutar el comando (país, provincia, ...). Al final tendremos dos ficheros ca.crt y ca.key que son el certificado de la autoridad de confianza que acabamos de crear y su par de claves.

Ahora, con este certificado, debemos firmar la petición que nos hizo el cliente en el paso "Crear solicitud del certificado". Para ello ejecutamos el comando

C:\>openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
Loading 'screen' into random state - done
Signature ok
subject=/C=ES/ST=MADRID/L=ALCALA/O=CHUIDIANG/OU=EJEMPLOS/CN=chuidiang.com
Getting CA Private Key
Enter pass phrase for ca.key:

Con esto decimos que la validez del certificado que vamos a crear es 365 días. Al ejecutar nos pedirá la password del fichero de claves ca.key que creamos con el comando anterior y listo, con esto tendremos nuestro certificado server.crt firmado por ca.crt.

Instalación en Apache

Para instalarlo en apache, debemos asegurarnos de que tenemos el módulo mod_ssl habilitado.

LoadModule ssl_module modules/mod_ssl.so

La configuración en apache puede ser más o menos compleja, debemos configurar toda la parte de ssl además de indicar cuales son nuestros certificados. Afortunadamente las instalaciones de Apache suelen traer algún fichero de configuración como ejemplo que nos valdrá prácticamente sin cambios. Veamos el ejemplo concreto de WAMP server (Apache+PHP+MySQL en Windows).

Dentro del directorio APACHE_HOME/conf/extras tenemos un fichero httpd-ssl.conf con una configuración por defecto. Sólo tenemos que asegurarnos de qu een el fichero APACHE_HOME/conf/httpd.conf tenemos descomentada la línea

Include conf/extra/httpd-ssl.conf

Ahora editamos el fichero https-ssl.conf para añadir nuestros certificados. Copiamos los certificados en algún sitio accesible para apache, por ejemplo, dentro del directorio conf de apache. En el fichero https-ssl.conf buscamos las dos líneas con SSLCertificateFile y SSLCertificateKeyFile y ponemos los paths completos hacia nuestros ficheros de certificado y claves. Para el de claves debemos usar el que tenemos desencriptado, ya que si no apache nos pedirá la clave al arrancar, cosa que no es deseable si queremos que apache arranque automáticamente al encender el ordenador.

SSLCertificateFile "C:/wamp/bin/apache/Apache2.2.17/conf/server.crt"
SSLCertificateKeyFile "C:/wamp/bin/apache/Apache2.2.17/conf/server.key"

Los path que aparecen ahí son los específicos para mi instalación de wamp server, tú deberás poner el que tengas. Ahora sólo nos queda reiniciar nuestro apache.

Creación de un certificado para el cliente

Creación del fichero PKCS#12

Podemos querer que sólo puedan ver nuestra página web aquellos visitantes a los que nosotros entregemos un certificado, de forma que si no lo tienen, no puedan ver la página web. Para ello, debemos crearles un certificado digital de cliente que deberán instalar en su navegador.

El proceso de crear el certificado es el mismo que ya hemos visto. Primero se generan un par de claves con openssl genrsa y luego se hace la solicitud de certificado con openssl req. Al igual que antes, este certificado debería firmarlo una autoridad de confianza, o puede autofirmarse. Supongamos que lo firmamos con la ca.crt que creamos antes. Los comandos sería estos

openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

Ya tenemos un certificado client.crt de cliente con su pareja de claves client.key. Para poder meter esto en el navegador, debemos juntarlo todo en un único fichero con formato PKCS#12. Para ello ejecutamos el comando

C:\>openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12
Loading 'screen' into random state - done
Enter pass phrase for client.key:
Enter Export Password:
Verifying - Enter Export Password:

Nos pide la clave para acceder a las claves del cliente (client.key) y luego nos pide dos veces una clave para encriptar el fichero cliente.p12 que es el fichero de salida que debemos instalar en nuestro navegador.

Configuración del servidor Apache

Ahora tenemos que configurar el servidor apache para indicarle que debe solicitar certificado de los clientes. También debemos decirle cuales son las autoridades de confianza de las que debe fiarse para aceptar a los clientes.

En el fichero httpd-ssl.conf, buscamos SSLVerifyClient y SSLVerifyDepth y hacemos que ponga esto

SSLVerifyClient require
SSLVerifyDepth  1

El primero indica que el cliente necesita certificado para poder ver las páginas. El segundo indica cuantos certificados intermedios aceptamos en la cadena hasta llegar a uno de confianza. Me explico. Nuestra autoridad de confianza ha firmado directamente el certificado de cliente, en este caso la profundidad de la cadena es 1. Pero podría suceder que nuestra autoridad de confianza firmara un certificado a una tercera persona y esta con su certificado firmara el de nuestro cliente. En este caso la profundidad es 2 (entre la autoridad de confianza y nuestro cliente hay un intermediario) y tal cual hemos configurado apache (SSLVerifyDepth a 1), este cliente sería rechazado. Si hubieramos puesto SSLVerifyDepth a 2, entonces sí se aceptaría.

Ahora buscamos SSLCACertificateFile y ponemos el certificado de nuestra autoridad de confianza. Esto indica a Apache cuales son las autoridades de confianza.

SSLCACertificateFile "C:/wamp/bin/apache/Apache2.2.17/conf/ca.crt"

Si hubiera más de una autoridad, debemos usar SSLCACertificatePath en vez de el anterior. Debemos hacer que esta directiva apunte o bien a un fichero en el que estén empaquetados todos los certificados de confianza, o bien a un directorio que los contenga.

En el caso de querer usar el directorio, además de los certificados debemos poner en el mismo directorio link simbólicos a cada uno de estos certificados. Estos link deben tener de nombre <hash>.N y apuntar al certificado. La forma de crearlos puede ser esta

$ cd <path con los certificados>
$ openssl x509 -noout -hash -in ca.crt
6f51b6a8
$ ln -s ca.crt  6f51b6a8.0

En el caso de linux, en el directorio APACHE_HOME/ssl.crt hay un Makefile. Si copiamos este Makefile en el directorio donde estan nuestros certificados de autoridades de confianza, el comando

$ make update

generará los links de antes.

Y si queremos la opción de empaquetar todos los certificados en un solo fichero, sólo tenemos que fijarnos que un certificado ca.crt es un fichero de texto con un contenido como este

-----BEGIN CERTIFICATE-----
MIIDozCCAougAwIBAgIJAIkiM6sGrs2NMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNV
BAYTAkVTMQ8wDQYDVQQIDAZNQURSSUQxDzANBgNVBAcMBkFMQ0FMQTESMBAGA1UE
CgwJQ0hVSURJQU5HMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNb3JnLmNodWlkaWFu
ZzAeFw0xMTEwMjkxMjIzMDJaFw0yMTEwMjYxMjIzMDJaMGgxCzAJBgNVBAYTAkVT
MQ8wDQYDVQQIDAZNQURSSUQxDzANBgNVBAcMBkFMQ0FMQTESMBAGA1UECgwJQ0hV
SURJQU5HMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNb3JnLmNodWlkaWFuZzCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO6V+JaKds1ypy6sfsJFlP1ICLXW
s+FsTkIKxN0eOBclrEAPtTpSRZ1CGnZyM2kBF/jJLE8iaL/RnzbF7WifP1fJp9Cc
lITgxihFKMDl+ON5s5x5LKjFaFTP3NU9ukFV06jK3mRMBkS725BK/LKYm14uvCzw
fTlHXltmLv+Fy5YE7wCyT9zcP86wH6IUqLYnc4j7FgwytcNlEX5FHiRQANgtqcQV
7zI0m8iGp4H2JzH7RBXsPpDx6JAe+dbr65YJjMgzxm88/157ORljIRsoRKm6L5YD
yN9amewCv7fMqu6FFqcCQaf05UhqoSxNWbAcJGHcTv7qdoXUO8Ee1k70F3UCAwEA
AaNQME4wHQYDVR0OBBYEFAix/RXu/9Z+6oq1Bx7UKOvCbTSjMB8GA1UdIwQYMBaA
FAix/RXu/9Z+6oq1Bx7UKOvCbTSjMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF
BQADggEBAHj0UTAPZWaJRDmVKcVwkKZzb0ncq625sF8HpwujmkX2ekvwl9BAxhdM
Ifx51U06kGoESKsXm8JIft12ovz5jf8fVJgkv0oL04hDgmN/eGEAPkAcQZTJ+043
xzrgdSBy/R59DSJkOVSZQ8/AGi0bCHOrTXrLfl+wjYFc5nK83PZW50666yCPALCL
E/fw6zkli30Dyq3HozcIhXU6/raK6me+z3f6ISgjdwhX5QWPqbReq09ReBt9vyJz
jQbf94KrPYnwlzdkGlQ46Vb1N99w9z/WnM/w7X0B2A4pl/Hyy+lmANykw3FxUV18
QmJgCql4i3jkrI/E1foZlCdoBtIUT3U=
-----END CERTIFICATE-----

por lo que para construir el fichero con todos los certificados nos bastará con un editor de textos e ir pegando uno detrás de otro (incluidas las líneas ----BEGIN CERTIFICATE---- y ------END CERTIFICATE-----------) en un único fichero.


Instalación en el navegador

Necesitamos instalar en el navegador el certificado de cliente, es decir, el fichero cliente.p12 que generamos en los pasos anteriores. La instalación en el navegador dependerá del sistema operativo y navegador en concreto. En el caso de windows nos bastará con hacer doble click sobre el fichero para iniciar el proceso de instalación. Si queremos hacerlo directamente en el navegador:

  • Para google chrome le damos a la lleva inglesa que hay arriba a la derecha para que se abra un menú. Elegimos opciones y se nos abrirá una nueva pestaña del navegador. En la página que se abre, elegimos opciones avanzadas y buscamos el apartado https/ssl. Pulsamos el botón administrar certificados, se abre una ventana en la que elegimos la pestaña personal y le damos al botón importar. Ahí nos pedirá el fichero client.p12 que acabamos de crear y nos pedirá la password con la que lo hemos encriptado.
  • Para internet explorer, herramientas, opciones de internet, pestaña contenido, botón certificados. En la ventana que se abre elegimos la pestaña personal y le damos al botón importar. Elegimos el fichero cliente.p12 y en el proceso nos pedira la contraseña con la que lo hemos encriptado.
  • Para firefox, en la esquina superior izquierda pulsamos firefox para que se abra el menú, opciones, opciones y en la ventana que se abre elegimos el icono de avanzado, la pestaña de cifrado, botón ver certificados y en la ventana que se abre vamos a sus certificados. Le damos al botón importar y elegimos el fichero cliente.p12. En el proceso nos pedirá la contraseña con la que lo hemos encriptado.

Si todo va bien, cuando intentemos visitar la página con el navegador, este nos mostrará los certificados que tenemos disponibles para que elijamos cual queremos presentar al servidor.