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

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

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.

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.

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 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

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:

[[email protected] 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 []:[email protected]

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

Como podemos comprobar, se han generado los ficheros esperados:

[root[email protected] 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
[[email protected] 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

[[email protected] 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

[[email protected] 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

[[email protected] ~]# 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
[[email protected] ~]#

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.

[[email protected] 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 = [email protected]

[ 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 = [email protected]
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
[[email protected] mz.abogadoo.com]#

genera_key.sh

Genera la clave privada.

[[email protected] 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
[[email protected] mz.abogadoo.com]#

genera_crt.sh

Genera el certificado sellado.

[[email protected] 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
[[email protected] mz.abogadoo.com]#

genera_csr.sh

[[email protected] 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

[[email protected] mz.abogadoo.com]#

genera_key_ca.sh

[[email protected] 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
[[email protected] 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.

¿Te ha gustado? ¡Compártelo!

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

SUSCRÍBETE A PUERTO53

Recibe un email periódico con los artículos más interesantes de Puerto53.com

Antes de suscribirte lee los términos y condiciones. Gracias.

Contenido Relacionado

Artículos Recientes

Deja un comentario

About Author