Установка сертификата Let's Encrypt на NGINX

Let's Encrypt - это центр сертификации, предлагающий бесплатные SSL / TLS сертификаты. Для их установки необходимо загрузить и запустить клиент Let's Encrypt.

Перед выдачей сертификата Let's Encrypt проверяет право на домен. Проверка выполняется с помощью создания временного файла на хостинге.

Загрузка клиента

Выполняем команды:

sudo apt-get update
sudo apt-get install -y git
sudo git clone https://github.com/certbot/certbot /opt/letsencrypt

Создание шаблона для временного файла

Клиент Let's Encrypt создаёт временный файл, который используется сервером Let's Encrypt для проверки того, что вы владеете доменом, на который пытаетесь получить сертификат. В примере ниже каталог, в котором Let's Encrypt будет хранить временный файл, это /var/www/letencrypt.

Создаём каталог для хранения временного файла и устанавливаем разрешения:

cd /var/www
mkdir letsencrypt
sudo chgrp www-data letsencrypt

Создаём файл /etc/letencrypt/configs/my-domain.conf, где my-domain это полное доменное имя. Содержимое файла следующее:

# the domain we want to get the cert for;
# technically it's possible to have multiple of this lines, but it only worked
# with one domain for me, another one only got one cert, so I would recommend
# separate config files per domain.
domains = my-domain

# increase key size
rsa-key-size = 2048 # Or 4096

# the current closed beta (as of 2015-Nov-07) is using this server
server = https://acme-v01.api.letsencrypt.org/directory

# this address will receive renewal reminders
email = my-email

# turn off the ncurses UI, we want this to be run as a cronjob
text = True

# authenticate by placing a file in the webroot (under .well-known/acme-challenge/)
# and then letting LE fetch it
authenticator = webroot
webroot-path = /var/www/letsencrypt/

В поля domains и email устанавливаем свои значения.

Разрешаем Let’s Encrypt доступ к временному файлу

Для этого необходимо модифицировать конфигурацию NGINX.

Добавляем location блок к виртуальному серверу для HTTP-трафика:

server {
listen 80 default_server;
server_name my-domain;

location /.well-known/acme-challenge {
root /var/www/letsencrypt;
}
# ...
}

Выполняем команду которая проверит синтаксис и перезапустит NGINX:

sudo nginx -t && sudo nginx -s reload

Запрос сертификата

Выполняем команды:

cd /opt/letsencrypt
./certbot-auto --config /etc/letsencrypt/configs/my-domain.conf certonly

Вместо my-domain, указываем свой домен.

Должно появится сообщение об удачном получении сертификата.

Указываем NGINX полученный сертификат

Добавляем сертификат и ключ в блок server для HTTP-трафика:

server {
listen 443 ssl default_server;
server_name my-domain;

ssl_certificate /etc/letsencrypt/live/my-domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-domain/privkey.pem;

# ...
}

Выполняем команду для проверки синтаксиса и перезапуска NGINX:

sudo nginx -t && sudo nginx -s reload

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

Сертификаты действительны только в течении 90 дней, после чего их нужно обновить. Этот процесс можно автоматизировать с помощью cron.

Создаём просто скрипт который будет обновлять сертификаты и перезапускать NGINX в случае успеха. Сохраняем его как renew-letsencrypt.sh в каталоге у которому у cron есть разрешения.

Код скрипта:

#!/bin/sh

cd /opt/letsencrypt/
./certbot-auto --config /etc/letsencrypt/configs/my-domain.conf certonly

if [ $? -ne 0 ]
then
ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log`
echo -e "The Let's Encrypt cert has not been renewed! \n \n" \
$ERRORLOG
else
nginx -s reload
fi

exit 0

my-domain меняем на свой домен.

Создаём /var/log/letencrypt/ если не существует.

Запускаем crontab -e и вводим строку ниже, чтобы запускать скрипт каждые два месяца.

0 0 1 JAN,MAR,MAY,JUL,SEP,NOV * /path/to/renew-letsencrypt.sh
comments powered by Disqus


К списку Предыдущий "Как скрыть панели для управляющих блоков контроллера в HostCMS"