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.