Для создания сертификатов будем использовать программу Certbot и бесплатные сертификаты от Let's Encrypt.
Certbot сам автоматически устанавливает сертификаты в
/etc/letsencrypt/live/, прописывает в конфиг Nginx новые строки параметров
ssl_certificate и
ssl_certificate_key с путями к файлам сертификата и ключа, а также настраивает в конфиге Nginx перенаправление пользователей, зашедших по
http://, на
https:// версию сайта.
Кроме того, Certbot создает системный таймер, по которому дважды в день он сам будет продлевать срок действия сертификатов, чтобы вам не нужно было об этом заботиться. Срок действия сертификатов Let's Encrypt всего 90 дней, так что вручную их продлевать было бы неудобно.
Требования
- Необходим зарегистрированный домен (доменное имя) для сайта, и в записях DNS этот домен должен указывать на IP-адрес вашего сервера с сайтом.
- Порты 80 и 443 должны быть открыты на сервере. Порт 80 используется для проверки сертификатов, а 443 - для работы сайта по HTTPS.
- В конфиге сайта (
/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.
Теперь Certbot скачает сертификаты и пропишет их в конфиг Nginx.
Для проверки все ли в порядке можно запустить продление сертификатов в сухом (тестовом) режиме (от root или sudo):
certbot renew --dry-run
Что если у вас уже есть свой сертификат?
Если вы уже купили сертификат и у вас есть файл сертификата
.crt и файл ключа
.key, достаточно просто вручную прописать в конфиг Nginx строки:
ssl_certificate /путь/к/сертификату.crt
ssl_certificate_key /путь/к/ключу.key
и перезапустить Nginx
sudo nginx -s reload
Что если вы передумали и хотите все отменить?
Сперва удаляем сертификаты:
sudo certbot delete
Certbot спросит какие сертификаты вы хотите удалить, вводим номера через пробел/запятую, либо оставляем пустое поле для удаления всех сертификатов в списке.
Отключаем службу автопродления (пример для 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
Вот теперь все чисто и ваш сайт снова не защищен.