Certificados Digitales
Tags: webdev, cybersecurity, tutorial
Published: 2021-07-08 15:50:57

## ¿Para qué necesito un certificado?

Desde hace muchos años, la web implementa **SSL (Secure Socket Layer)** y su sucesor, **TLS (Transport Layer Security)**, como protocolos para establecer enlaces cifrados entre redes. Es por ello que es esencial el uso de certificados en cualquier servicio web moderno.

## ¿Qué es un certificado?

SSL y TLS funcionan mediante certificados de clave pública **x.509**. Básicamente estos certificados vinculan la identidad de una entidad a un **par de claves criptográficas**. Cada par consta de una **clave pública** y una **clave privada**, la primera se distribuye mediante certificados mientras que la segunda se mantiene segura. Esto permite, mediante el [criptografía asimétrica](https://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica), crear una conexión segura entre un cliente y un servicio.

## Autoridad Certificadora

En este punto es donde entran las **autoridades certificadoras**. Básicamente son autoridades de confianza que verifican la identidad de los servicios web antes de generar los certificados que hemos mencionado antes. Así, un **navegador web** tiene ciertas garantías de la legitimidad de una página si el **certificado ha sido emitido por una de estas autoridades**.

![CA Overview](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nd07e441bp7pwm6qj4a3.png)
 

## Certificado autofirmado

Vamos ahora a ver cómo generar estos certificados para poder utilizarlos en nuestros servicios. Vamos a empezar con el método más simple, generar estos certificados por nuestra cuenta. Este método es bastante sencillo, pero implica que los navegadores y otras herramientas **generarán alertas al no ser certificados emitidos por una autoridad certificadora**.

La herramienta más extendida para generar estos certificados es [OpenSSL](https://www.openssl.org/), es por ello que hay que tener instalada esta utilidad como requisito previo. Ahora simplemente hay que seguir los siguientes pasos:

* Generar una clave privada RSA con [AES256](https://es.wikipedia.org/wiki/Advanced_Encryption_Standard) con contraseña

```bash
openssl genrsa -aes256 -passout pass:[TU CONTRASEÑA] -out service.pass.key 4096
openssl rsa -passin pass:[TU CONTRASEÑA] -in services.pass.key -out service.key
rm service.pass.key
```


* Generar el certificado con la clave privada

```bash
openssl req -new -x509 -key service.key -out cert.crt -days 365
```

Siguiendo estos pasos generaremos un certificado llamado `cert.crt` listo para su uso.

![openssl](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnzrldieyoh7kqdaw1g4.png)
 

## CSR

Si os habéis fijado, antes de crear el fichero, nos han pedido cierta información para generar una **petición de certificado**. Esto es lo que se conoce como **CSR o Certificate Signing Request**. Un CSR consiste básicamente en la clave pública de un par de claves e información adicional, como el país del certificado, mail de la empresa firmante, etc. Estos dos componentes se insertan en la creación del certificado. A continuación voy a mostrar como generar un CSR y como generar un certificado con un CSR ya creado, como veréis es muy similar.

* Generar un CSR con una clave privada

```bash
openssl req -new -key service.key -out service.csr
```

* Generar certificado mediante un CSR

```bash
openssl x509 -req -sha256 -days 356 -in service.csr -signkey service.key -out service.crt
```

## Certificado firmado con letsencrypt

Hasta ahora hemos hablado de **certificados autofirmados**, que están bien para probar servicios en etapa de desarrollo. Pero en el momento que creamos un despliegue en producción es esencial tener certificados emitidos por una autoridad certificadora.

Entre las muchas entidades certificadoras, personalmente suelo usar **letsencrypt** y su herramienta **certbot** de forma automatizada en mis despliegues. Ya que es posible, teniendo un dominio asegurado, generar en pocos pasos certificados que podrán auto-renovarse automáticamente.

Para ello lo mejor es consultar la página de [certbot](https://certbot.eff.org/) y seguir los pasos determinados para el despliegue que vayamos a realizar.

![certbot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9w9m6amkvingegk7032p.png)
 

Como habéis podido comprobar, los certificados son algo esencial en cualquier servicio web moderno. Gracias al comportamiento de los navegadores modernos, cualquier servicio con certificados mal configurados, expirados o simplemente sin ellos, son inmediatamente bloqueados, dificultando así su acceso y añadiendo una capa de seguridad. Es por ello muy importante asegurar el **correcto funcionamiento de los certificados en producción**.

Espero que este pequeño artículo os haya aclarado algunos conceptos y os ayude en el desarrollo de vuestras plataformas.

Saludos 👋