Autenticacion web basada en certificados SSL (CentOS)


Todos creo que conocemos OpenSSL la navaja suiza del cifrado y el uso que se les da a los certificados SSL al dia de hoy para proporcionar una conexión segura HTTPS.

En este post abarcaremos el uso de estos certificados para autenticarnos en un sitio web. Crearemos un sitio web que solo sea accedido o sea visible para ciertos clientes o personas que posean el certificado llave(Publica).

Este post se ha generado para aquellos que han tenido problemas de realizar esta tarea en servidores CentOS. ;)

Escenario:

OpenSSL
Mod-SSL
Apache
CentOS 6.3

Instalación de OpenSSL
Pasaremos a instalar OpenSSL y el respectivo modulo SSL para el servidor web (APACHE) en nuestro servidor y crearemos los certificados necesario. el modulo es necesario para que apache interactué con Openssl y este viene los repositorios de Centos 6.3 y también en EPEL.


[root@localhost ~]# yum install openssl
[root@localhost ~]# yum install mod_ssl

Una vez tengamos instalado OpenSSL y el modulo SSL para apache pasaremos a crear los certificados (Privada y publica). si sera un cifrado asimetrico, ya que es conveniente para el sistema plantado.

[root@localhost ~]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
............+++
...............................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

Como ven en el comando estamos solicitando que nuestra clave sea de 2048 bits, una vez ejecutado el comando antes de generar la clave privada nos solicitara ingresar una contraseña, esta es para proteger el archivo de posibles descifrado.

Ya que tenemos nuestra llave privada pasaremos a crear el certificado a firmar y llenarlo con los datos necesarios del servidor, dominio o empresa. este certificado sera el identificador de nuestro servidor, dominio o empresa.

[root@localhost ~]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
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) [XX]:CO
State or Province Name (full name) []:COLOMBIA
Locality Name (eg, city) [Default City]:BOGOTA
Organization Name (eg, company) [Default Company Ltd]:ANTONIOJORZ
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

El comando nos solicitara la contraseña quemada en la llave privada para acceder a el. durante el proceso de creacion se nos solicitaran los datos con los cuales se va identificar nuestro sitio web y/o servidor. como mi servidor es local y obviamente lo voy autofirmar posteriormente, lo llenare con cualquier dato. en caso que se genere en producción el campo "Common Name" debe estar quemado el dominio o subdominio del servidor.

Autofirmamos el certificado
una vez creado nuestro certificado indentificador llega el momento de firmarlo en nuestro caso como mencione anteriormente no sera un ente quien lo firme, sera autofirmado por el server esto debido que es para fines educativos en un ambiente local..

Primero creamos nuestro propio CA (Certification Authority)


[root@localhost ~]# openssl req -x509 -newkey rsa:2048 -keyout ca.key -days 730 -out ca.crt
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) [XX]:CO
State or Province Name (full name) []:COLOMBIA
Locality Name (eg, city) [Default City]:BOGOTA
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Creamos nuestro propio certificado de autoridad de confianza con validez de dos años. Este certifica do ca.crt sera quien firme el certificado de nuestro servidor web.

Firmamos el certificado con el CA


[root@localhost ~]# openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
Signature ok
subject=/C=CO/ST=COLOMBIA/L=BOGOTA/O=ANTONIOJORZ/emailAddress=frenyman@gmail.com
Getting CA Private Key
Enter pass phrase for ca.key:

Con el comando anterior estamos firmando el certificado del servidor web con nuestro CA con una validez de 1 año, este comando nos generara un certificado CRT.

Generación de certificado Cliente

Como decía al comenzar este post, lo buscado es que solo ciertas personas puedan ver nuestro sitio web y para eso crearemos este certificado cliente, como llave de acceso
El proceso es exactamente el mismo que los anteriores.


[root@localhost ~]#openssl genrsa -des3 -out client.key 2048
[root@localhost ~]#openssl req -new -key client.key -out client.csr
[root@localhost ~]#openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

Ya con esto tenemos nuestro certificado cliente.crt y sus respectiva llaves ahora debemos pasar a unir estos archivos y convertirlos en único fichero con formato PKCS#12.


[root@localhost ~]# openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12
Enter pass phrase for client.key:
Enter Export Password:
Verifying - Enter Export Password:

El comando al ejecutar solicita la contraseña para acceder a la llave cliente. y luego una contraseña para el certificado, yo la dejare nula.


Preparando Apache y ModSSL

Primero editamos el archivo de configuracion de SSL para agregar los nombres y/o path de los certificados creados.
Abrimos el archivo /etc/httpd/conf.d/ssl.conf
Buscamos
SSLCertificateFile 
SSLCertificateKeyFile 
Y editamos con los nombres de los certificados generados en nuestro caso "server"


SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key

Ahora debemos indicarle ha Apache que debe solicitar dichos certificados.
Estando en el mismo fichero buscamos SSLVerifyClient y SSLVerifyDepth
descomentamos y editamos de la siguiente manera

SSLVerifyClient require
SSLVerifyDepth  1

Donde indicaremos con la primera variable que se requiere de un certificado SSL para poder ver el sitio web y con la segunda variable estamos pasando el parametro del numero de certificadoras autorizadas que firmaron nuestro certificado, en nuestro caso 1 ya que fue autofirmado y no hay mas de 1 ente intermediando.

Ahora buscamos lo siguiente SSLCACertificateFile.
descomentamos y editamos el nombre de nuestro certificado de confianza, en nuestro caso CA.crt


SSLCACertificateFile /etc/pki/tls/certs/ca.crt


Guardamos y reiniciamos Apache.

[root@localhost ~]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Apache/2.2.15 mod_ssl/2.2.15 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server localhost.localdomain:443 (RSA)
Enter pass phrase:

OK: Pass Phrase Dialog successful.
                                                           [  OK  ]

Apache nos solicitara la contraseña quemada en la llave privada del servidor.

Si requieren que no se las solicite cada vez que reinicien deben decifrar con openssl la llave con la misma contraseña quemada. claro esta que esto se considera un riesgo de seguridad.

Una vez reiniciado el servicio de Apache. ingresamos al navegador y digitamos la ip del servidor bajo el protocolo HTTPS.



al intentar ver la web veremos que no es visible y requeriremos del certificado de autenticacion cliente "cliente.p12" el que fue anteriormente empaquetado.

Si nos encontramos en sistemas windows simplemente hacemos doble clic en el archivo cliente.p12 y siga los pasos de importación. este importara y aplicara (Funcional para navegadores chrome e IE)

para navegadores basados en firefox se debe agregar independientemente. Para importarlo simplemente nos vamos a:
Menu-->Opciones-->Avanzado-->Certificados-->Ver Certificados -->Sus Certificados

una vez importado el certificado actualizamos navegador este nos solicitara selecionar un certificado como autenticacion.

Una vez selecionado el Certificado de autenticacion este nos permitira ver nuestra web.





Saludos.

Post basado en la fuente y reformado para CentOS.
Fuente

Written by

0 comentarios :

Comentarios en GooglePlus

Reacciones en G+