aboutsummaryrefslogtreecommitdiff
path: root/content/weblog/2018-08-12_ssl-with-lets-encrypt/index.ru.md
blob: c414941c0fbb1b597de5a6edc3882e629927f533 (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
+++
title = "Легкий и халявный SSL с Let's Encrypt"
date = 2018-08-12T22:28:00Z
+++

Всем нам известно насколько важна безопасность в веб-разработке, и не только в
вебе. И не надо забыть про тот самый SEO Google который повышает рейтинг сайтов
которые работают с https вместо старого доброго http. (Хоть мне плевать на
Google, но мои клиенты так не думают, также как основная часть аудитории этой
статьи)

<!-- more -->

Возможно вы давно хотели добавить SSL сертификат для своего сайта или сервиса,
но чувак, они же деньги стоят! А вот вы ошибаетесь (Если вы уже знали про Let's
Encrypt, то прощу прошение за такое бесполезное введение).

В этом туториале я коротко объясню как сгенерировать сертификат SSL с Let's
Encrypt с помощью Certbot используя nginx. В моем случае я его устанавливал на
Debian Stretch, комманда для установки Certbot может отличатся для вас в
зависимости от вашей ОСи.

Перед тем как начать, устанавливаем

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

До того как мы сможем установить сертификат, нам нужно настроить nginx для
установки и последовательной продления сертификата. Для этого нам понадобится
поменять дефолтный файл настройки сервера nginx. Нам это необходимо сделать для
того чтобы, сервер Let's Encrypt смог прочитать файл "челленджа" сгенерирован
Certbot'ом и убедится в том что домен(ы) действительно наш(и).

```
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...
}
```

После того как мы редактировали настройки, нам потребуется перезапустить с

```
# sudo systemctl restart nginx
```

Теперь у нас все готово чтобы сгенерировать сертификат. Мне нужен был
сертификат для несколько поддоменов, так что я их всех добавил в список
аргументов используя флаг -d, например

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

Certbot попросит ваш адрес электронной почти, в который будут отправляться
уведомления об истекании срока действия вашего сертификата. Однако Certbot
красавчик умеет их продлевать автоматический.

Вот и наш сертификат готов. А теперь вы можете настроить nginx чтобы он принимал
https запросы и делал редирект http запросов на https. Не забудьте добавить
правильный путь к вашему сертификату и ключу в `ssl_certificate` и
`ssl_certificate_key` соответственно.

```
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;
        }
}
```

Один минус автоматического редиректа, заключается в том что старые браузеры,
(ох уж эти старые неубиваемые версси Internet Explorer) которые не поддерживают
https, не смогут открыть ваш сайт. Но лично мне по барабану на браузера
десятилетней давности.

Вы можете найти больше информации по Certbot на этой странице (сайт на
английском):
[https://certbot.eff.org/docs/using.html](https://certbot.eff.org/docs/using.html)

Редактировано (2018/11/02): Недавно в 2018 Let's Encrypt добавили возможность
сгенерировать универсальный сертификат для всех поддоменов (например,
*.example.com).

Чтобы сгенерировать такой вид сертификата, нам понадобится скачать последнюю
версию certbot из официального репозитория гита

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

После этого можем перейти в каталог certbot, и выполнить следующую комманду

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

Для этого нам понадобится добавить запись TXT в настройках DNS нашего домена,
посколько для таких сертификатов только доступен "dns challenge". Перед тем как
нажать на клавишу ввода, убедитесь что настройки вашего домена обновлены.

Имейте ввиду что такие виды сертификатов нельзя обновлять в автоматическом режиме.