¿Qué es y cómo funciona un certificado SSL?

Un certificado SSL es un componente de seguridad en una página WEB que autentifica que esa página es de quien dice ser y, además, encripta todo el tráfico.

Certificado SSL Seguro
El navegador está mostrando que usamos un certificado SSL seguro

El cifrado se realiza mediante un sistema de clave pública y privada y es imprescindible para proteger datos sensibles del tráfico de una página WEB ante la mirada indiscreta de los hackers.

Por ejemplo, no interesa a nadie que el formulario donde insertamos nuestro usuario y contraseña en la página de nuestro banco online envíe estos datos sin encriptar por la red porque el tráfico se puede interceptar.

En relación con este punto, es totalmente desaconsejable utilizar redes wifi públicas para conectarnos a WEBs personales importantes. Obviamente, cualquiera que esté conectado a una red Wifi puede utilizar herramientas para escanear el tráfico. Si da la casualidad de que te conectas a una página donde no utilizan un certificado SSL en el formulario de login, un hacker podrá ver exactamente el usuario, la contraseña y la URL que utilizas.

Ver Repetidores Wifi de Exterior

Un certificado SSL hace ilegible el tráfico interceptado por un hacker.

¿Quién dice que nuestro certificado es auténtico?

Las entidades autorizadores (CA) son organizaciones públicas con la autoridad suficiente como para decidir que nuestro certificado es auténtico tras haber realizado algunas comprobaciones previas y, navegadores como Google Chrome, Firefox, etc. tienen acuerdos con estas organizaciones para confiar en los certificados que emiten.

Es decir, cuando queremos instalar un certificado en nuestra página WEB, tenemos que enviar a la entidad autentificadora una serie de datos que nos solicitan: URL, nombre, apellidos, empresa, país, ciudad, etc. Dependiendo de la entidad autorizadora nos pedirán más o menos datos para su posterior verificación.

Una vez que les hemos enviado los datos que nos solicitan, nos suelen pedir un cambio en nuestra página WEB para asegurarse de que somos sus administradores. Por ejemplo, la instalación de un fichero con una clave que nos envían o una modificación en el registro de DNS (si lo administramos nosotros).

Si consiguen verificar que somos los dueños de la URL para la que estamos solicitando el certificado, nos lo enviarán sellado por ellos para que lo instalemos en nuestro servidor WEB.

Obviamente, este servicio tiene un coste.

Para puerto53.com utilicé goddaddy, tal y como puedes comprobar tu mismo.

Certificado SSL Godaddy
Certificado SSL expedido por Godaddy

Si estás utilizando el navegador google chrome, encontrarás esta información en el menú Más herramientas –> Herramientas para desarrolladores –> Pestaña security –> View Certificate

Chrome view certificate
Ver un certificado SSL desde Google Chrome

¿Cómo se genera un certificado SSL?

Para generar un certificado SSL utilizaremos la utilidad Openssl para generar el fichero de clave privada (.key) y el contenido del certificado (CSR).

El fichero CSR lo enviaremos a la entidad autentificadora para que nos envíe el certificado sellado (CRT).

Veamos un ejemplo:

[puerto53@prt53ws2 puerto53]$ openssl req -new -newkey rsa:2048 -nodes -keyout puerto53.com.key -out puerto53.com.csr
Generating a 2048 bit RSA private key
……..+++
………………………………………………………………..+++
writing new private key to ‘puerto53.com.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]:ES
State or Province Name (full name) []:Barcelona
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:David Martinez Perales
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:puerto53.com
Email Address []:david_martinez_perales@yahoo.es

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[puerto53@prt53ws2 puerto53]$

Como podemos comprobar, se han generado los ficheros esperados:

[root@prt53ws1 puerto53]# ll
total 24
-rwx—— 1 puerto53 puerto53 184 Sep 21 16:42 genera_key_csr.sh
-rwx—— 1 puerto53 puerto53 4795 Sep 21 16:45 puerto53.com_ca.crt
-rwx—— 1 puerto53 puerto53 1858 Sep 21 16:34 puerto53.com.crt
-rwx—— 1 puerto53 puerto53 1082 Sep 21 15:03 puerto53.com.csr
-rwx—— 1 puerto53 puerto53 1704 Sep 21 15:03 puerto53.com.key
[root@prt53ws1 puerto53]#

El fichero puerto53.com_ca.crt no lo hemos generado nosotros. Este es el fichero «CA Intermedia» que se utiliza en nuestro webserver para indicar quién es la entidad autentificadora que verifica nuestro certificado. Este fichero nos lo envía la entidad autentificadora. En este caso, Godaddy.

Los ficheros CSR y KEY los hemos generado nosotros con el comando anterior de openssl.

Por cierto, comentar, que uso Linux.

Obtener la información de un certificado

Si queremos obtener la información de un certificado, utilizaremos los siguientes comandos de OpenSSL:

Fichero CSR

[root@prt53ws1 puerto53]# openssl req -text -noout < puerto53.com.csr
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=ES, ST=Barcelona, L=Default City, O=David Martinez Perales, CN=puerto53.com/emailAddress=XXXX
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)

Fichero CRT

[root@prt53ws1 puerto53]# openssl x509 -in puerto53.com.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
fe:8d:18:04:de:e5:fe:91
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority – G2
Validity
Not Before: Sep 21 13:35:00 2017 GMT
Not After : Sep 21 13:35:00 2018 GMT
Subject: OU=Domain Control Validated, CN=puerto53.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)

Instalación del certificado en el servidor WEB

En mi caso, estoy utilizando Apache como servidor WEB. Éste es uno de los webservers más utilizados en el mundo.

Para configurar nuestro certificado SSL en Apache, habilitaremos el módulo SSL y configuraremos las siguientes directivas:

SSLCertificateFile /SSL/puerto53.com.crt
SSLCertificateKeyFile /SSL/puerto53.com.key
SSLCACertificateFile /SSL/puerto53.com_ca.crt

[root@prt53ws1 ~]# ps -ef |grep -i httpd |head -1
puerto53 1037 1 0 Sep23 ? 00:00:04 httpd -f /app/puerto53/httpd/conf/httpd.conf -k start -D SSL
[root@prt53ws1 ~]#

Fabricar nuestro propio certificado SSL

En los entornos de desarrollo o en aquellos servidores que no tienen acceso directo a Internet, no nos interesa gastarnos el dinero en comprar un certificado SSL público, sino que nos lo podemos crear nosotros mismos.

El procedimiento es muy parecido al anterior, solamente que lo sellamos nosotros sin tener que pasar por una entidad autentificadora.

Como comentaba en ¿Quién soy? hace tiempo creé la página abogadoo.com que, finalmente, cerré. Sin embargo, aprovecharé los scripts que creé en aquel momento para generar el certificado de los webservers de la MZ. Son los siguientes:

Los ejecutamos en el siguiente orden:

  1. genera_key,sh
  2. genera_crt.sh
  3. genera_csr.sh
  4. genera_key_ca.sh
  5. generacrt_ca.sh

Fichero openssl.cnf

Este fichero contiene los datos del certificado.

[root@ip-172-31-2-216 mz.abogadoo.com]# cat openssl.cnf
dir = .

[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial # archivo que guarda el siguiente nzmero de serie
database = $dir/index.txt # archvio que guarda la bd de certificados
new_certs_dir = $dir/cert # dir que guarda los certificados generados
certificate = $dir/mz.abogadoo.com.crt # nombre del archivo del certificado ramz
private_key = $dir/mz.abogadoo.com.key # llave privada del certificado ramz
#private_key = $dir/mz.abogadoo.com.key
default_md = sha256 # algoritmo de dispersisn usado
preserve = no # Indica si se preserva o no el orden de los
# campos del DN cuando se pasa a los certs.
nameopt = default_ca # esta opcion y la siguiente permiten mostrar
# detalles del certificado
certopt = default_ca
policy = policy_match # indica el nombre de la seccion
# donde se especifica que campos son
# obligatorios, opcionales y cuales deben ser
# iguales al certificado ramz
default_days = 3650

# seccion de politicas para la emision de certificados
[ policy_match ]
countryName = ES # match, obligatorio
stateOrProvinceName = Barcelona
organizationName = Abogadoo
organizationalUnitName = optional # optional, campo opcional
commonName = mz.abogadoo.com # supplied, debe estar en la peticisn
emailAddress = contacto@abogadoo.com

[ req_distinguished_name ]
countryName = ES
countryName_default = ES
countryName_min = 2
countryName_max = 2

stateOrProvinceName = Barcelona
stateOrProvinceName_default = Barcelona

localityName = Barcelona
localityName_default = Barcelona

0.organizationName = Abogadoo
0.organizationName_default = Abogadoo

1.organizationName = NA
1.organizationName_default = NA

organizationalUnitName = NA
organizationalUnitName_default = NA

commonName = mz.abogadoo.com
commonName_max = 64

emailAddress = contacto@abogadoo.com
emailAddress_max = 40

# seccion que indica como los certificados deben ser creados
[ req ]
default_bits = 2048 # tamaqo de la llave, si no se indica 512
default_keyfile = mz.abogadoo.key.unsecure # nombre de la llave privada
default_md = sha256 # algoritmo de dispersisn a utilizar
string_mask = nombstr # caracteres permitidos en la mascara de la llave
distinguished_name = req_distinguished_name # seccion para el nombre distinguido (DN)
req_extensions = v3_req # seccion con mas extensiones que se aqaden a la
# peticion del certificado

# extensiones de la opcion req
[ v3_req ]
basicConstraints = CA:FALSE # los certificados firmados no son CA
#basicConstraints = CA:TRUE # los certificados firmados no son CA
subjectKeyIdentifier = hash

[alt_names]
DNS.1 = mz.abogadoo.com
[root@ip-172-31-2-216 mz.abogadoo.com]#

genera_key.sh

Genera la clave privada.

[root@ip-172-31-2-216 mz.abogadoo.com]# cat genera_key.sh
set -x

export RANDFILE=random.txt

KEY_FILE=mz.abogadoo.com.key

/usr/bin/openssl genrsa -out $KEY_FILE 2048
/usr/bin/openssl rsa -in $KEY_FILE -out ${KEY_FILE}.unsecure
[root@ip-172-31-2-216 mz.abogadoo.com]#

genera_crt.sh

Genera el certificado sellado.

[root@ip-172-31-2-216 mz.abogadoo.com]# cat genera_crt.sh
set -x

export OPENSSL_CONF=openssl.cnf

CERT_FILE=mz.abogadoo.com.crt
KEY_FILE=mz.abogadoo.com.key

/usr/bin/openssl req -new -x509 -days 20000 -key $KEY_FILE -out $CERT_FILE
[root@ip-172-31-2-216 mz.abogadoo.com]#

genera_csr.sh

[root@ip-172-31-2-216 mz.abogadoo.com]# cat genera_csr.sh
set -x

OPENSSL_PATH=/opt/hpws/apache/bin
export PATH=$OPENSSL_PATH:$PATH

export OPENSSL_CONF=openssl.cnf

KEY_FILE=mz.abogadoo.com.key
CSR_FILE=mz.abogadoo.com.csr

openssl req -new -key $KEY_FILE -out $CSR_FILE -subj ‘/CN=mz.abogadoo.com/O=Abogadoo/C=ES’

openssl req -noout -text -in $CSR_FILE

[root@ip-172-31-2-216 mz.abogadoo.com]#

genera_key_ca.sh

[root@ip-172-31-2-216 mz.abogadoo.com]# cat genera_key_ca.sh
set -x

export RANDFILE=random.txt

KEY_FILE=mz.abogadoo.com_ca.key

/usr/bin/openssl genrsa -out $KEY_FILE 2048 #Si queremos generar una clave de 2048 bits, en vez de 1024, escribiremos 2048.

/usr/bin/openssl rsa -in $KEY_FILE -out ${KEY_FILE}.unsecure
[root@ip-172-31-2-216 mz.abogadoo.com]#

Tras la generación del certificado anterior, las directivas SSL de Apache quedarían de la siguiente manera:

SSLCertificateFile /app/GestionExpedientesJuridicos/httpd/conf/certificados/mz.abogadoo.com.crt
SSLCertificateKeyFile /app/GestionExpedientesJuridicos/httpd/conf/certificados/mz.abogadoo.com.key.unsecure
SSLCACertificateFile /app/GestionExpedientesJuridicos/httpd/conf/certificados/mz.abogadoo.com_ca.crt

Certificados wildcard

Un certificado wildcard es aquel que protege el dominio y todos los subdominios de una página WEB. Por ejemplo: puerto53.com media.puerto53.com, mail.puerto53.com, etc.

Si, finalmente, te has decidido a comprar un certificado SSL en Godaddy, te dejo mi enlace de afiliado. Así me harás ganar una comisión y a ti no te costará más 😉

Comprar un certificado SSL en Godaddy

Espero que este artículo te haya sido de utilidad.

Gracias.

COMPÁRTEME

Deja un comentario