Логотип
vexaiv

Защищенное соединение HTTPS для сайта на Nginx

Для создания сертификатов будем использовать программу Certbot и бесплатные сертификаты от Let's Encrypt.

Certbot сам автоматически устанавливает сертификаты в /etc/letsencrypt/live/, прописывает в конфиг Nginx новые строки параметров ssl_certificate и ssl_certificate_key с путями к файлам сертификата и ключа, а также настраивает в конфиге Nginx перенаправление пользователей, зашедших по http://, на https:// версию сайта.

Кроме того, Certbot создает системный таймер, по которому дважды в день он сам будет продлевать срок действия сертификатов, чтобы вам не нужно было об этом заботиться. Срок действия сертификатов Let's Encrypt всего 90 дней, так что вручную их продлевать было бы неудобно.

Требования


  1. Необходим зарегистрированный домен (доменное имя) для сайта, и в записях DNS этот домен должен указывать на IP-адрес вашего сервера с сайтом.
  1. Порты 80 и 443 должны быть открыты на сервере. Порт 80 используется для проверки сертификатов, а 443 - для работы сайта по HTTPS.
  1. В конфиге сайта (/etc/nginx/sites-enabled/site) в параметре server_name должно быть указано доменное имя вашего сайта (например, server_name site.ru www.site.ru).

Установка Certbot


Для Debian и его форков:
	
    sudo apt update
sudo apt install certbot python3-certbot-nginx

Установка сертификатов


Запускаем Certbot от root или sudo (вместо site.ru пишете домен вашего сайта):
	
    certbot --nginx -d site.ru -d www.site.ru

Certbot спросит e-mail, на который будут отправляться уведомления об истечении строка действия сертификатов.

Потом запросит согласие с условиями (вводим Y).

Дальше спросит хотите ли вы сообшить ваш e-mail некоммерческой организации, связанной с Let's Encrypt, которая разрабатывает Certbot. Можете отказаться набрав N.
https://vexaiv.ru/images/articles/certbot/certbot_setup.png
Теперь Certbot скачает сертификаты и пропишет их в конфиг Nginx.
https://vexaiv.ru/images/articles/certbot/certbot_nginx_new.png
Для проверки все ли в порядке можно запустить продление сертификатов в сухом (тестовом) режиме (от root или sudo):
	
    certbot renew --dry-run
https://vexaiv.ru/images/articles/certbot/certbot_test.png

Что если у вас уже есть свой сертификат?


Если вы уже купили сертификат и у вас есть файл сертификата .crt и файл ключа .key, достаточно просто вручную прописать в конфиг Nginx строки:
	
    ssl_certificate /путь/к/сертификату.crt
ssl_certificate_key /путь/к/ключу.key
и перезапустить Nginx
	
    sudo nginx -s reload

Что если вы передумали и хотите все отменить?


Сперва удаляем сертификаты:
	
    sudo certbot delete

Certbot спросит какие сертификаты вы хотите удалить, вводим номера через пробел/запятую, либо оставляем пустое поле для удаления всех сертификатов в списке.
https://vexaiv.ru/images/articles/certbot/certbot_delete.png
Отключаем службу автопродления (пример для systemd):
	
    sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer

Удаляем cron задачу:
	
    sudo rm -f /etc/cron.d/certbot

Удаляем сам Certbot:
	
    sudo apt remove --autoremove --purge certbot python3-certbot-nginx

Удаляем файлы Let's Encrypt (если вдруг остались):
	
    sudo rm -rf /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt

И вручную вычищаем строки, добавленные в конфиг Nginx. Следим при этом за соблюдением открывающих и закрывающих фигурных скобок, чтобы не поломать конфиг. Проверяем конфиг перезагрузкой Nginx:
	
    nginx -s reload

Вот теперь все чисто и ваш сайт снова не защищен.