Настройка Lets Encrypt для Nginx

Данная инструкция описывает настройку бесплатного https сертификата Let's Encrypt для Nginx через Certbot.

Certbot — это программа, которая облегчает установку и продление бесплатных https сертификатов от Let's Encrypt.

Инструкция

Установка пакетов:

yum -y install yum-utils
yum install python2-certbot-nginx

Nginx config:

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	server_name example.com;

	root /var/www/domains/example.com;
	index index.html;

	location /.well-known {
		root /var/www/html;
		allow all;
		break;
	}
}

Установка сертификатов:

certbot --nginx --webroot-path=/var/www/html

После выполнения команды, certbot автоматически обновит конфиги Nginx.

Генерация dhparam

Генерирация файла dh4096.pem

openssl dhparam -out /etc/letsencrypt/live/dh4096.pem 4096

Вставьте в nginx файл настроек сервера следующие строки:

ssl_dhparam /etc/letsencrypt/live/dh4096.pem;

# Запретить показывать сайт во фрейме11
add_header X-Frame-Options DENY;

# Использовать отданный сервером Сontent-type, вместо автоматического его определения
add_header X-Content-Type-Options nosniff;

# Активировать XSS-защиту:
add_header X-XSS-Protection "1; mode=block"; 

Редирект на https

Чтобы добавить редирект, укажите в nginx конфиге следующие строки:

if ($ssl_protocol = ""){
	rewrite ^/(.*) https://$server_name/$1 permanent;
}

Второй способ выдать сертификат

Данный способ отличается тем, что не нужно вводить с клавиатуры email, он задается в параметрах, и можно разделить домены по отдельным сертификатам. Т.е. выдать на каждый домен отдельные сертификаты.

certbot certonly --non-interactive --agree-tos --email <email> --cert-name <domain> --webroot --webroot-path=/var/www/html -d <domain1> -d <domain2>

В поле <email> укажите свой email, в <domain> — название группы, а в <domain1> и <domain2> — домены, которым нужно выдать сертификат. Ограничение 100 доменов на один сертификат. Подробнее про ограничения Let's Encrypt.

После выполнения данной команды нужно вручную прописать в nginx строчки в конце раздела сервер соотвествующего домена.

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

Полезные команды

Обновить сертификат:

certbot renew --cert-name <domain1>

Удалить сертификат:

certbot delete --cert-name <domain1>

Посмотреть список сертификатов:

certbot certificates

Автоматическое продление сертификата

Проверка продления сертификата:

certbot renew --dry-run

Флаг —dry-run нужен, чтобы certbot запустил команду в тестовом режиме, без применения изменений.

Для автоматического продления добавьте в крон:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow   command

# Продление сертификата
26 4 5,10,15,20,25 * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew 

# Перезапуск nginx сервера
32 6 5,10,15,20,25 * * /bin/systemctl reload nginx.service

sleep нужен, чтобы сервер acme не заблокировал ваш сервер, из-за того что certbot запускается по крону.

Wildcard сертификат

Wildcard не поддерживает автоматическое обновление, поэтому обновлять и устанавливать нужно вручную каждые 3 месяца.

Процесс установки и обновления одинаковый. Вместо example.com укажите свой ДНС адрес. В тексте далее будет использован в качестве примера домен example.com.

Установка:

certbot -i nginx -d *.example.com -d example.com --server https://acme-v02.api.letsencrypt.org/directory  --preferred-challenges dns --manual

Сначала certbot спросит о том, что IP адрес должен быть логирован. Чтобы продолжить установку, нужно согласиться.

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

Во время выполнения запросов вам нужно будет добавить две TXT записи, которые укажет certbot.

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

YOUR-DNS-KEY

Before continuing, verify the record is deployed.

Сначала вам нужно будет прописать ДНС запись. Подождать пока применяться изменения, проверить изменения командой:

nslookup -type=TXT _acme-challenge.example.com

DNS записи будут две. Нужно будет создать две записи.

Далее certbot спросит, на какие домены устанавливать сертификат

-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): c

Введите c, так как это wildcard сертификат, либо оставьте пустое значение, если вы хотите установить сертификаты на все домены в вашем nginx конфиге.

Если вы не хотите, чтобы был установлен автоматический редирект на https, выберите опцию 1

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

Ссылки на полезные материалы

  1. Let's Encrypt — Free SSL/TLS Certificates
  2. Certbot
  3. Nginx и https. Получаем класс А+
  4. Проверка HTTPS сертификата
  5. SSL Checker
  6. Крон тестер