Задача
СкопированоПравильная работа современного сайта обеспечивает защиту данных пользователя. Для этого используется сертификаты безопасности, которые позволяют использовать сайт с помощью защищённого протокола HTTPS. Перед нами стоит задача: настроить протокол HTTPS для веб-сервера Nginx на основе сертификатов Let’s Encrypt.
Подробнее о веб-сервере можно прочитать в статье «Веб-сервер», подробнее о Nginx — в статье «Веб-сервер Nginx». Если не совсем понятно, что такое SSL- или TLS-сертификаты, можно прочитать об этом в статье «SSL-сертификаты».
Готовое решение
СкопированоЧтобы включить HTTPS для вашего сайта, вам необходимо получить сертификат от центра сертификации. Let’s Encrypt — это бесплатный, автоматизированный и открытый центр сертификации от некоммерческой исследовательской группы по интернет-безопасности (ISRG).
Этот сертификат валиден в течение 90 дней после генерации. После истечения срока его необходимо будет сгенерировать заново (это можно сделать, например, с помощью службы cron). Само собой, у вас должен быть доступ к серверу, на котором ваш сайт находится.
В зависимости от операционной системы и её настроек, установка веб-сервера и настройка файервола будет отличаться, но базовые принципы сохранятся.
Включение порта для работы с HTTPS (пример с firewall
):
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --add-service=https --permanent
Если этот файервол не установлен, на Linux, использующих RPM-пакеты (Fedora, RedHat, Oracle Linux и других) это можно сделать командой:
sudo dnf -y install firewalld
sudo dnf -y install firewalld
На Linux с deb-пакетами (Ubuntu, Debian или других):
sudo apt install firewalld
sudo apt install firewalld
Затем нужно его запустить:
sudo systemctl start firewalld
sudo systemctl start firewalld
Установка snap и certbot на дистрибутивах Linux, использующих RPM-пакеты:
sudo dnf -y install snapd
sudo dnf -y install snapd
На Linux с deb-пакетами:
sudo apt install snapd
sudo apt install snapd
Затем нужно настроить snap и certbot:
sudo systemctl enable --now snapd.socketsudo systemctl start snapdsudo ln -s /var/lib/snapd/snap /snapsudo snap install coresudo snap refresh coresudo snap install --classic certbotsudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo systemctl enable --now snapd.socket sudo systemctl start snapd sudo ln -s /var/lib/snapd/snap /snap sudo snap install core sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
Настройка базовой конфигурации:
server { listen 80; root /web/sites/example.com/www/; server_name example.com;}
server { listen 80; root /web/sites/example.com/www/; server_name example.com; }
После установки базовой конфигурации необходимо проверить её корректность и перезапустить веб-сервер:
nginx -tsudo systemctl restart nginx
nginx -t sudo systemctl restart nginx
Генерация сертификатов:
/usr/bin/certbot certonly --webroot -w /var/www/html --email root@example.com -d example.com -d www.example.com
/usr/bin/certbot certonly --webroot -w /var/www/html --email root@example.com -d example.com -d www.example.com
Пример последующей настройки для статического сайта после автоматической генерации конфигурации:
server { listen 80; server_name example.com; rewrite_log on; error_log /web/sites/example.com/logs/error.log; access_log /web/sites/example.com/logs/access.log; location / { return 301 https://$host$request_uri; }}server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always; error_log /web/sites/example.com/logs/error.log; access_log /web/sites/example.com/logs/access.log; root /web/sites/example.com/www/; index index.html; location / { error_page 404 /404/index.html; try_files $uri $uri/ /index.html =404; } location ~* \.(js|jpg|jpeg|gif|png|webp|avif|css|pdf|bmp|ico|woff2|svg)$ { expires 1y; add_header Cache-Control "must-revalidate, public, max-age=31536000"; }}
server { listen 80; server_name example.com; rewrite_log on; error_log /web/sites/example.com/logs/error.log; access_log /web/sites/example.com/logs/access.log; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always; error_log /web/sites/example.com/logs/error.log; access_log /web/sites/example.com/logs/access.log; root /web/sites/example.com/www/; index index.html; location / { error_page 404 /404/index.html; try_files $uri $uri/ /index.html =404; } location ~* \.(js|jpg|jpeg|gif|png|webp|avif|css|pdf|bmp|ico|woff2|svg)$ { expires 1y; add_header Cache-Control "must-revalidate, public, max-age=31536000"; } }
Проверка корректности конфигурации:
nginx -t
nginx -t
Перезапуск и проверка состояния Nginx:
sudo systemctl restart nginxsudo systemctl status nginx
sudo systemctl restart nginx sudo systemctl status nginx