Цели занятия
На этом занятии настраивается защищённое подключение к сайту через HTTPS. Перед началом должен уже работать сайт на Nginx и должен быть открыт доступ к портам 80/tcp и 443/tcp.
После занятия студент должен уметь:
- объяснить разницу между HTTP и HTTPS;
- назвать назначение TLS-сертификата;
- проверить, что домен указывает на сервер;
- открыть порты
80и443в firewall; - установить Certbot;
- получить сертификат для Nginx;
- проверить автоматическое продление сертификата;
- найти ошибки в конфигурации и логах.
1. HTTP и HTTPS
HTTP передаёт данные между браузером и сервером без шифрования. HTTPS использует TLS-шифрование и защищает данные от перехвата и подмены.
| Протокол | Порт | Шифрование | Пример адреса |
|---|---|---|---|
| HTTP | 80/tcp |
Нет | http://example.com |
| HTTPS | 443/tcp |
Да | https://example.com |
Зачем нужен TLS-сертификат
TLS-сертификат подтверждает, что браузер подключается к нужному домену, и позволяет зашифровать обмен данными между клиентом и сервером.
2. Что нужно до настройки HTTPS
Перед получением сертификата должны быть выполнены базовые условия.
| Условие | Как проверить |
|---|---|
| Есть домен | Например, example.com. |
| Домен указывает на IP сервера | dig example.com или ping example.com. |
| Nginx работает | sudo systemctl status nginx. |
| Порт 80 открыт | sudo ufw status. |
| Порт 443 открыт | sudo ufw status. |
Открытие портов
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
Проверка Nginx
sudo nginx -t
sudo systemctl status nginx
3. Установка Certbot
certbot — это утилита для получения TLS-сертификатов и настройки их продления.
Установка пакетов
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
Получение сертификата для домена
sudo certbot --nginx -d example.com -d www.example.com
Вместо example.com нужно указать свой домен.
Что делает команда
- проверяет, что домен доступен;
- получает сертификат;
- добавляет HTTPS-настройки в конфигурацию Nginx;
- может настроить перенаправление с HTTP на HTTPS.
www, команда может быть такой: sudo certbot --nginx -d example.com.
4. Конфигурация Nginx до получения сертификата
До запуска Certbot в конфиге сайта должен быть правильный server_name. Нельзя оставлять только server_name _;, если сертификат нужен для настоящего домена.
Пример HTTP-конфига
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Проверка и применение
sudo nginx -t
sudo systemctl reload nginx
server_name всегда проверяйте конфигурацию командой sudo nginx -t.
5. Перенаправление с HTTP на HTTPS
После настройки HTTPS обычно нужно сделать так, чтобы пользователь автоматически переходил с http:// на https://.
Пример server-блока для редиректа
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Основной HTTPS-блок
server {
listen 443 ssl;
server_name example.com www.example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
6. Автоматическое продление сертификата
Сертификаты нужно регулярно продлевать. Certbot настраивает автоматическое продление, но его нужно уметь проверять.
Проверка таймера Certbot
systemctl list-timers | grep certbot
Тестовое продление
sudo certbot renew --dry-run
Просмотр установленных сертификатов
sudo certbot certificates
sudo certbot renew --dry-run завершился без ошибок, механизм продления работает корректно.
7. Диагностика ошибок HTTPS
Ошибки HTTPS нужно проверять по цепочке: домен, firewall, Nginx, Certbot, логи.
| Проблема | Возможная причина | Проверка |
|---|---|---|
| Certbot не может получить сертификат | Домен не указывает на сервер или закрыт порт 80 | dig example.com, sudo ufw status |
| Сайт не открывается по HTTPS | Закрыт порт 443 или ошибка в Nginx | sudo nginx -t, sudo ss -tulpn | grep ':443' |
| Браузер показывает ошибку сертификата | Сертификат выдан не на тот домен | sudo certbot certificates |
| После настройки сайт перестал открываться | Ошибка в server block | sudo tail -n 100 /var/log/nginx/error.log |
Команды для проверки
curl -I http://example.com
curl -I https://example.com
sudo nginx -t
sudo systemctl status nginx
sudo tail -n 100 /var/log/nginx/error.log
8. Практическая работа
dig example.com
sudo nginx -t
sudo systemctl status nginx
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com
curl -I http://example.com
curl -I https://example.com
sudo certbot renew --dry-run
9. Мини-проверка
Вопросы
- Чем HTTPS отличается от HTTP?
- Для чего нужен TLS-сертификат?
- Какой порт используется для HTTP?
- Какой порт используется для HTTPS?
- Почему перед получением сертификата домен должен указывать на сервер?
- Какая команда устанавливает Certbot для Nginx?
- Какая команда получает сертификат для домена?
- Зачем нужен редирект с HTTP на HTTPS?
- Как проверить конфигурацию Nginx?
- Как проверить тестовое продление сертификата?
Ответы для самопроверки
- HTTPS использует шифрование, HTTP не использует.
- Для подтверждения домена и шифрования соединения.
80/tcp.443/tcp.- Certbot должен подтвердить, что сервер управляет этим доменом.
sudo apt install certbot python3-certbot-nginx -y.sudo certbot --nginx -d example.com.- Чтобы пользователи всегда попадали на защищённую версию сайта.
sudo nginx -t.sudo certbot renew --dry-run.
10. Итоговый порядок настройки HTTPS
1. Проверить домен:
dig example.com
2. Проверить Nginx:
sudo nginx -t
sudo systemctl status nginx
3. Открыть порты:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
4. Установить Certbot:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
5. Получить сертификат:
sudo certbot --nginx -d example.com
6. Проверить сайт:
curl -I https://example.com
7. Проверить продление:
sudo certbot renew --dry-run