Настройка Nginx + SSL от Let’s Encrypt (вариант 2, элегантный)

Feb 9, 2017 21:08 · 520 words · 3 minute read nginx ssl

Ранее мы уже рассматривали процесс настройки Nginx c SSL-сертификатами от Let’s Encrypt в ОС Debian 8, однако стоит признать, что есть более элегантный и простой способ настройки и использования бесплатных сертификатов. Давайте разберемся!

Итак, сначала нужно установить Certbot. Для ОС Debian Jessie сначала потребуется подключить backports, добавив в /etc/apt/sources.list следующую строку:

deb http://ftp.debian.org/debian/ jessie-backports main contrib non-free

Далее выполняем:

aptitude update && aptitude install certbot -t jessie-backports

Для ОС Ubuntu версий ниже 16.10 установка Certbot сводится к следующему:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install --upgrade letsencrypt

Примечание. Дальше в командной строке вместо certbot можно использовать letsencrypt.

Инструкции по установке для других дистрибутивов можно поискать здесь, но они обычно сводятся к:

wget -O /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
chmod +x /usr/local/bin/certbot-auto
ln -s /usr/local/bin/certbot-auto /usr/local/bin/certbot

Получать/продлевать сертификаты будем по методу webroot без перезапуска web-сервера (Nginx), следовательно нам нужен каталог, который будет доступен удостоверяющему серверу из Интернета и в который certbot будет писать свои временные файлы. Для этого, в общем случае, во всех блоках server надо было добавить следующий location:

...
    # Webroot for Lets Encrypt
    location ~ /.well-known {
       allow all;
    }
...

Если сайтов несколько, то вписывать такой блок для каждого неразумно, поэтому создадим файл /etc/nginx/acme следующего содержания:

# Webroot for Lets Encrypt
location /.well-known {
    root /var/www/html;
}

И далее для каждого домена, для которого подключаем сертификат, в блоке server будем инклудить этот файл:

...
include acme;
...

Аналогично следует поступить с настройками ssl — вынести их в отдельный файл и инклудить по необходимости. Для этого создаем файл /etc/nginx/ssl с таким содержимым:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
 
resolver 127.0.0.1 valid=300s;
resolver_timeout 10s;

И теперь, вместо указания всех ssl-настроек в блоке server (как мы делали в предыдущий раз), указываем только пути к сертификатам (они будут отличаться для каждого сайта) и инклудим общие настройки:

...
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
 
    include /etc/nginx/ssl;
...

Чтобы каждый раз при создании/продлении сертификата не писать длинную строку из опций, сохраним их в файл конфигурации /etc/letsencrypt/cli.ini:

authenticator = webroot
webroot-path = /var/www/html
post-hook = service nginx reload
text = True

Также нужно зарегистрироваться в Let’s Encrypt (если вы еще не зарегистрированы и это ваш первый опыт настройки сертификатов):

certbot register --email admin@example.com

Теперь все готово для получения сертификата, запускаем в командной строке:

certbot certonly -d example.com

Если вы вдруг забыли указать поддомен (например, www) или с момента получения сертификата у вас появились новые поддомены, то можно просто запустить команду еще раз, добавив нужные имена:

certbot certonly -d example.com -d www.example.com -d voip.example.com

Сертификаты выдаются на три месяца, но с автоматическим продлением никаких проблем нет. Если вы используете ОС Debian Jessie, то в кронтабе /etc/cron.d/certbot нужно добавить ключ --allow-subset-of-names. Этот ключ позволяет получить сертификаты для частичного набора доменов (особенно актуально при переносе поддоменов на другие сервера).

Если у вас другая ОС (или просто нет файла /etc/cron.d/certbot), то следует добавить одну строку в рутовый кронтаб, для этого делаем:

sudo crontab -e

И дописываем следующую строку:

42 */12 * * * certbot renew --quiet --allow-subset-of-names

На этом все, ну а для поклонников утилит tee и sed есть хорошее руководство от Алексея Копытько.

tweet Share