Настройка Nginx + SSL от Let’s Encrypt (вариант 2, элегантный)
Feb 9, 2017 21:08 · 520 words · 3 minute read
Ранее мы уже рассматривали процесс настройки 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
есть хорошее руководство от Алексея Копытько.