Бесплатный https с Nginx

9 марта 2016. Комментарии .

Краткая инструкция по настройке https с помощью Let’s Encrypt на ОС Ubuntu с вебсервером Nginx. Сначала прочтите всё до конца, а потом выполняйте. Написано по мотивам рекомендаций от hombit. Если что-то не получится, обязательно задавайте вопросы в комментариях. Полная официальная инструкция на английском доступна на readthedocs.org.

После успешного перехода на https внешние ресурсы (например, js, тэги <img>) надо брать только по https, иначе замо́чек в адресной строке не будет зелёным.

Оглавление #

Установка Let’s Encrypt #

Устанавливаем их программу. Для определённости будем считать, что мы находимся в /home/user/.

user ~ $
user ~ $
cd
git clone https://github.com/letsencrypt/letsencrypt 

Останавливаем Nginx:

root ~ #
service nginx stop 

Теперь в роли вебсервера сможет выступить программа, которую мы только что установили. Это нужно для того, чтобы их сервер мог зайти на указанный клиентом домен и убедиться в том, что таким образом можно попасть на его машину.

Запускаем их программу в первый раз (с правами root), чтобы она установила все зависимости из репозиториев:

user ~ $
cd letsencrypt 
root letsencrypt #
./letsencrypt-auto --help 

Запускаем программу во второй раз и запрашиваем сертификат (опять с правами root). Замените mydomain.com на своё доменное имя.

root letsencrypt #
./letsencrypt-auto certonly -d mydomain.com 

Действуем аналогично, если есть поддомен:

root letsencrypt #
./letsencrypt-auto certonly -d subdomain.mydomain.com 

Программа попросит электронную почту. Она пригодится для:

После выполнения программа сообщит, что установила сертификаты в /etc/letsencrypt/live/mydomain.com.

Настройка Nginx #

Настройка домена в Nginx #

Пора настроить Nginx. Замените mydomain.com на своё доменное имя.

/etc/nginx/sites-available/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 # Перенаправляем http://(www.)mydomain.com на https://mydomain.com
server {
server_name mydomain.com www.mydomain.com;
return 301 https://$server_name$request_uri;
}

# Если есть поддомен. Если поддоменов нет, то следующие 3 строки не нужны
server {
server_name subdomain.mydomain.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Всё остальное, что было в секции server
# ...
}

Настройка поддомена в Nginx #

Если имеется поддомен, например, subdomain.mydomain.com, ему нужно указать такие настройки:

/etc/nginx/sites-available/subdomain
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
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# Укажите свой адрес для root
root /var/www/subdomain;
index index.html index.htm;
server_name subdomain.mydomain.com;

ssl_certificate /etc/letsencrypt/live/subdomain.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/subdomain.mydomain.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# Всё остальное, что было в секции server
# ...

}

Готово! Снова запускаем Nginx:

root ~ #
service nginx start 

Обновление сертификата #

Через какое-то время придёт уведомление о том, что срок действия сертификата истлевает. Чтобы обновить его, нужно сделать следующие действия.

user ~ $
cd ~/letsencrypt/
root letsencrypt #
root letsencrypt #
root letsencrypt #
service nginx stop
./letsencrypt-auto renew   
service nginx start

Проверка статуса сертификата #

Чтобы узнать статус и срок действия своего сертификата, можно в браузере зайти на сайт и щёлкнуть на иконку замка́ в адресной строке. В Safari, например, надо будет ещё нажать на «Show Certificate», а в Chrome дату можно увидеть так: щёлкнуть на замо́чек → вкладка Connection → Certificate information → General → Expires on.