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;
    }

}

Все.


Полезные ссылки