aboutsummaryrefslogtreecommitdiff
path: root/content/weblog/2018-08-12_ssl-with-lets-encrypt/index.es.md
blob: c8ef57724db14c5f881021260a804532a419441b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
+++
title = "SSL en tu sitio fácil y gratis con Let's Encrypt"
date = 2018-08-12T22:28:00Z
+++

Es bien sabido en esta época que la seguridad es una parte importante de
desarrollo web, y no solamente. Y como olvidar ese suculento SEO de Google, que
da prioridad a sitios que usan https en lugar del antiguo http (Aunque para ser
sincero me da igual Google, sin embargo mis clientes y la mayoría de los que
lleguen a leer esto si le dan importancia)

<!-- more -->

Quieres agregarle SSL a tu sitio, pero vaya, que esos certificados cuestan
dinero. Ah, pero he ahí donde estás equivocado (A menos que ya sepas a cerca de
Let's Encrypt y simplemente hayas entrado a leer este tutorial para saber como
generar un certificado. En dado caso sinceramente pido perdón por esta patética
introducción).

En esta guía detallaré los pasos para adquirir un certificado SSL de Let's
Encrypt con Certbot en un servidor con nginx. Instalaré Certbot en un servidor
Debian Stretch, si usas otra distro de Linux (o BSD, etc.) es probable que
necesites usar otro comando para instalarlo.

Primero instalamos Certbot

```
# apt-get install certbot
```

Antes de podar instalar certificados, necesitamos configurar nginx para ello.
Podemos modificar la configuración por defecto para ello. Necesitamos hacer
esto para que el servidor de Let's Encrypt puede leer el archivo de "desafío"
para verificar que en efecto el(los) dominio(s) nos pertenece(n).

```
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        # This is so that Let's Encrypt can look for the challenge
        location /.well-known/acme-challenge/ {
                root /var/www/html/;
                default_type text/plain;
        }

        # The rest of your configuration...
}
```

Una vez editado el archivo de configuración necesitamos reiniciar nginx.

```
# sudo systemctl restart nginx
```

Después de reiniciar nginx podemos proceder con la instalación del certificado.
En mi caso necesito el certificado para múltiples subdominios, por lo tanto los
agregaré usando la opción -d para cada uno de ellos en mi lista de argumentos
como en el ejemplo siguiente

```
# certbot certonly --webroot -w /var/www/html -d www.example.com -d example.com
```

Durante el proceso de generación de certificados Certbot te pedirá tu correo
electrónico. Let's Encrypt enviará notificaciones a el cuando el certificado
esté a punto de expirar, sin embargo Certbot se encargará de renovarlos antes
de que expiren automáticamente.

Con esto nuestros certificados están instalados en el servidor y listos para
ser usados. Lo último que queda por hacer es configurar nginx para que use los
certificados y redirija de http a https. En las variables `ssl_certificate`
`ssl_certificate_key` ponemos la dirección en el sistema de archivos de nuestro
certificado y nuestra llave publica.

```
server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;

        server_name www.example.com;
        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /path/to/key/www.example.com/privkey.pem;
        location /static/ {
                alias /home/webuser/mysite/static/;
        }
        location /media/ {
                alias /home/webuser/mysite/media/;
        }
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8001;
        }
}
```

Un contra de redirigir a https automáticamente es que los exploradores antiguos
que no son compatibles con https no podrán abrir el sitio web. Pero vaya, que
estamos en 2018, no deberíamos de preocuparnos por exploradores de hace 10 y
más años.

Para más información acerca de Certbot:
[https://certbot.eff.org/docs/using.html](https://certbot.eff.org/docs/using.html)

Actualización (2018/11/02): Hace un tiempo en 2018, Let's Encrypt agregó la posibilidad de generar un certificado "universal" para todos los subdominios (por ejemplo, *.example.com).

Para generar dicho certificado, primero necesitamos descargar la última versión de certbot del repositorio oficial de git

```sh
$ git clone https://github.com/certbot/certbot.git
```

Después entramos al directorio "certbot" y ejecutamos

```sh
$ ./certbot-auto certonly --manual \
> --preferred-challenges=dns \
> --email email@example.com \
> --server https://acme-v02.api.letsencrypt.org/directory \
> --agree-tos \
> -d *.example.com
```

Certbot te presentará con un "desafío" de DNS en el que tendrás que agregar una
entrada de tipo TXT a la configuración de tu dominio, ya que este tipo de
certificados sólo funciona con el "reto" de dns. Asegúrate de que tu
configuración de DNS ya esté actualizada antes presionar "Enter".

También ten en cuenta que actualmente no es posible renovar automáticamente
certificados de este tipo.