Creación de certificados de cliente a partir de una CA propia

En el universo web existen diversas formas de establecer un mecanismo de conexión segura (https), mediante el cifrado de las comunicaciones entre los clientes (usuarios) y el servidor (servicios web). En este post explicaremos cómo crear certificados de cliente con un certificado de servidor asociado, a partir de una entidad certificadora (CA) también creada por nosotros para poder firmar los certificados que generemos. En primer lugar, se deberá crear una entidad certificadora propia, para lo cual podemos ejecutar el siguiente comando:

$ openssl req -nodes -x509 -newkey rsa:2048 -days 3650 -keyout <nom_CA>.key -out <nom_CA>.crt
Generating a 2048 bit RSA private key
...........................................................................+++
.....................+++
writing new private key to 'CA-API_Mgmt.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) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA GlobalNet
Organizational Unit Name (eg, section) []:Sistemas
Common Name (eg, your name or your server's hostname) []:ca.bbvaglobalnet.com
Email Address []:

De toda la información que se solicita durante el proceso de creación de la CA, el campo más relevante es el "Common Name" (CN), ya que define el nombre que va a poseer la entidad certificadora que estamos originando. En el ejemplo expuesto se ha especificado el nombre ca.bbvaglobalnet.com. Una vez creada la entidad certificadora, podemos proceder a crear el certificado SSL que deberá utilizarse en el lado del servidor. Para ello, ejecutar el siguiente procedimiento:

  • Creación de un par de claves para el certificado (clave privada / clave pública) y generación de la solicitud de firma del certificado (CSR):
$ openssl genrsa -out <nom_cert_servidor>.key 2048
Generating RSA private key, 2048 bit long modulus
..........................................................+++
.......................................................................................................+++
e is 65537 (0x10001)

$ openssl req -new -key <nom_cert_servidor>.key -out <nom_cert_servidor>.csr
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) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA GlobalNet
Organizational Unit Name (eg, section) []:Sistemas
Common Name (eg, your name or your server's hostname) []:api-management.bbvaglobalnet.com
Email Address []:

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

Durante el proceso de generación de la solicitud de firma del certificado se deberá introducir la información que irá asociada al mismo. Entre los campos solicitados se encuentra el "Common Name" (CN), en el cual debe especificarse el nombre de dominio asociado a la aplicación para la cual se está generando el certificado. Es importante que el CN asignado a la entidad certificadora sea distinto que el CN del certificado, ya que en caso contrario las peticiones que se hagan al servidor devolverán un error de tipo sec_error_bad_signature.

  • Generación de un fichero de configuración con los parámetros necesarios para la creación del certificado de servidor:
$ cat >servidor.conf <<_EOF
basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth
_EOF

 

  • Creación del certificado SSL de servidor firmado por nuestra entidad certificadora, a partir de la solicitud de firma del certificado que se ha generado anteriormente:
$ openssl x509 -CA <nom_CA>.crt -CAkey <nom_CA>.key -req -extfile servidor.conf -in <nom_cert_servidor>.csr -days 3650 -CAcreateserial -sha1 -out <nom_cert_servidor>.crt
Signature ok
subject=/C=ES/ST=Madrid/L=Madrid/O=BBVA GlobalNet/OU=Sistemas/CN=api-management.bbvaglobalnet.com
Getting CA Private Key

 

Con la realización de estos pasos ya tendremos creado el certificado del servidor. El siguiente paso será incluirlo junto con la entidad certificadora que lo ha firmado (la que hemos creado) en la configuración SSL del servidor Apache (por ejemplo…). Una vez configurado el certificado en el lado del servidor, procedemos a crear el certificado de cliente siguiendo el procedimiento que se describe a continuación:

  • Creación de un par de claves para el certificado (clave privada / clave pública) y generación de la solicitud de firma del certificado (CSR):
$ openssl genrsa -out <nom_cert_cliente>.key 2048
Generating RSA private key, 2048 bit long modulus
...................+++
.......+++
e is 65537 (0x10001)

$ openssl req -new -key <nom_cert_cliente>.key -out <nom_cert_cliente>.csr
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) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA
Organizational Unit Name (eg, section) []:Plataformas financieras digitales
Common Name (eg, your name or your server's hostname) []:www.bbva.com
Email Address []:

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

 

  • Generación de un fichero de configuración con los parámetros necesarios para la creación del certificado de cliente:
cat >cliente.conf <<_EOF
basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth
_EOF

 

  • Creación del certificado SSL de cliente firmado por nuestra entidad certificadora, a partir de la solicitud de firma del certificado que se ha generado anteriormente:
$ openssl x509 -CA <nom_CA>.crt -CAkey <nom_CA>.key -req -extfile cliente.conf -in <nom_cert_cliente>.csr -days 3650 -CAcreateserial -sha1 -out <nom_cert_cliente>.crt
Signature ok
subject=/C=ES/ST=Madrid/L=Madrid/O=BBVA/OU=Plataformas financieras digitales/CN=www.bbva.com
Getting CA Private Key

 

  • Conversión del certificado a formato pkcs12 para poder importarlo en el navegador del cliente:
$ openssl pkcs12 -export -in <nom_cert_cliente>.crt -inkey <nom_cert_cliente>.key -certfile <nom_CA>.crt -out <nom_cert_cliente>.p12
Enter Export Password:Acceso_Cliente01
Verifying - Enter Export Password:Acceso_Cliente01

La contraseña de exportación que se especifique será solicitada al usuario al importar el certificado pkcs12 que se ha generado en el navegador del cliente.

WordPressTwitterBlogger PostShare

Montar un dispositivo Linux

A más de alguno de nosotros nos habrá surgido en algún momento la necesidad de montar un dispositivo externo (disco usb, memoria extraíble,etc). En sistemas operativos como Ubuntu ésto se realiza automáticamente. En el caso de el montaje automático falle, y no eres un usuario experto, te sugiero utilizar los siguientes pasos para montarlo manualmente…. Continue reading

WordPressTwitterBlogger PostShare

No Sql en Amazon Web Services

¿Qué es No SQL?

A diferencia de lo que muchos puedan pensar NoSQL significa “no sólo SQL”, o lo que es lo mismo, nuevas formas de administración de la información. Esto supone romper con muchos de los conceptos que hemos aprendido del mundo relacional como las estructura de datos (tablas), operaciones relacionales como JOINs y propiedades fundamentales de las transacciones como ACID (atomicidad, coherencia,aislamiento y durabilidad), todo ello en favor del rendimiento y de la escalabilidad.

Continue reading

WordPressTwitterBlogger PostShare

Añadir un certificado a ELB AWS

Otro de los servicios que utilizamos para nuestros proyectos es Elastic Load Balancer (ELB) de Amazon el cual te permite distribuir el trafico entrante entre nuestras instancias EC2. ELB  entre otras muchas cosas, nos permite instalar un certificado, liberando de esta manera del “overhead ” provocado por la encriptación SSL a nuestro servidor Web Continue reading

WordPressTwitterBlogger PostShare