Table of Contents
Настройка связки nginx + letsencrypt
Вводная
Понадобился веб-сервер с letsencrypt сертификатами и автоматическим их продлением.
В качестве веб-сервера будем использовать nginx, автоматически продлевать сертификат будем с помощью Certbot, модуля webroot и протокола ACME.
Ставим необходимые пакеты
# apt update # apt install nginx letsencrypt certbot
Подготовка nginx
Для работы модуля webroot нужно создать директорию, где будут создаваться временные файлы для проверки.
Создать директорию и дать права.
# mkdir /var/www/acme # chown www-data:root /var/www/acme
Файл /etc/nginx/includes/acme с инструкцией для nginx.
location /.well-known/acme-challenge/ { root /var/www/acme; }
Чутка правим include nginx.conf
... #include /etc/nginx/sites-enabled/*; include /etc/nginx/sites-enabled/*.conf; ...
Генерируем ключ для работы алгоритма Диффи-Хеллмана.
openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 4096
Создаем файл со спец. настройками letsencrypt для nginx - /etc/letsencrypt/options-ssl-nginx.conf
# This file contains important security parameters. If you modify this file # manually, Certbot will be unable to automatically provide future security # updates. Instead, Certbot will print and log an error message with a path to # the up-to-date file that you will need to refer to when manually updating # this file. ssl_session_cache shared:le_nginx_SSL:10m; #ssl_session_timeout 1440m; ssl_session_timeout 40m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
Переписываем дефолтный vhost - /etc/nginx/sites-available/default.conf
Https секцию пока комментируем.
server { listen 80 default; include includes/acme; location / { return 444; } } #server { # listen 443 default; # server_name _; # ssl_certificate /etc/letsencrypt/live/default.site.xyz/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/default.site.xyz/privkey.pem; # include /etc/letsencrypt/options-ssl-nginx.conf; # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # # return 444; ## return 403; #}
Включаем дефолтный vhost.
# cd /etc/nginx/sites-enabled/ # ln -s /etc/nginx/sites-available/default.conf default.conf # systemctl restart nginx
Получаем первый сертификат.
# letsencrypt certonly -n --webroot -w /var/www/acme/ -d default.site.xyz --agree-tos --email null@site.xyz
После этого можно раcкомментировать https секцию в дефолтном vhost.
Ещё раз перезапускаем nginx.
vhost для сайта
Пишем vhost для сайта - /etc/nginx/sites-available/site_xyz.conf
server { listen 80; server_name site.xyz; include includes/acme; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name site.xyz; ssl_certificate /etc/letsencrypt/live/site.xyz/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site.xyz/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://127.0.0.1:81; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; # return 404; # return 301 https://ya.ru; } location ~* ^/(webstat|awstats|webmail|myadmin|pgadmin|phpmyadmin) { return 404; } location ~ /\.ht { return 404; } }
Все.