Создание сертификата Let’s Encrypt для Nginx в CentOS 7

Let’s Encrypt – это новый центр сертификации (ЦС, или Certificate Authority, CA), который предоставляет простой способ создания сертификатов TLS/SSL, тем самым позволяя шифровать HTTPS на веб-серверах. Этот ЦС упрощает процесс создания сертификатов путём автоматизации большинства необходимых действий при помощи клиентского ПО. На данный момент Let’s Encrypt ещё находится в открытом бета-тестировании; пока что процесс получения и установки сертификата полностью автоматизирован только на веб-серверах Apache. Тем не менее, Let’s Encrypt позволяет получить бесплатный сертификат SSL, который можно установить вручную независимо от программного обеспечения веб-сервера.

Данное руководство поможет установить Let’s Encrypt и получить SSL-сертификат для Nginx в системе CentOS 7 и покажет, как обновлять этот сертификат.

Требования

  • Настроенный сервер CentOS 7.
  • Не-root пользователь с доступом к sudo (инструкции по начальной настройке сервера и созданию пользователя можно найти в этом руководстве).
  • Доменное имя, которое можно использовать в сертификате (в руководстве используется условные домены example.com и www.example.com).
  • Запись А, связывающая домен с внешним IP-адресом сервера. Она необходима для того, чтобы Let’s Encrypt мог проверить доменное имя (в руководстве используется два домена, нужно создать запись А для каждого из них).

1: Установка клиента Let’s Encrypt

Чтобы получить SSL-сертификат от Let’s Encrypt, нужно сначала установить клиентскую программу letsencrypt. Клонируйте официальный репозиторий проекта на GitHub.

Установка Git и bc

Чтобы клонировать необходимый репозиторий, сначала нужно установить Git и bc.

Для этого можно использовать пакетный менеджер системы:

sudo yum install git bc

Клонирование репозитория Let’s Encrypt

Теперь можно клонировать репозиторий Let’s Encrypt с GitHub в каталог /opt:

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

2: Получение сертификата

Let’s Encrypt предлагает несколько способов получения сертификата при помощи разных плагинов. На данный момент плагины позволяют только получить сертификат, а настройку сервера для использования этого сертификата нужно выполнить вручную; исключением является плагин для Apache, работа с которым описана здесь.

Примечание: Плагины, которые помогают получить сертификат, но не устанавливают его, называются аутентификаторами.

В данном руководстве для создания SSL-сертификата используется плагин Standalone.

Проверка порта 80

Плагин Standalone позволяет быстро получить сертификат SSL. Он временно запускает отдельный веб-сервер на порт 80, к которому подключается Let’s Encrypt CA и подтверждает сертификат. Следовательно, для работы плагина необходим порт 80, потому нужно временно отключить обычный веб-сервер, если он занимает этот порт.

К примеру, при использовании Nginx нужно ввести:

sudo systemctl stop nginx

Чтобы узнать, занят ли порт 80, введите:

netstat -na | grep ':80.*LISTEN'

Если команда не вернула никакого результата, значит, порт свободен, и можно запускать плагин Standalone.

Запуск Let’s Encrypt

Перейдите в каталог letsencrypt.

cd /opt/letsencrypt

Затем используйте плагин Standalone:

./letsencrypt-auto certonly --standalone

Примечание: Программное обеспечение Let’s Encrypt требует привилегий суперпользователя. Программа может запросить пароль. Также при первом запуске команда letsencrypt-auto может установить дополнительные пакеты.

После запуска letsencrypt запросит некоторые данные.

Примечание: Вопросы, задаваемые при первом запуске программы, отличаются от вопросов, задаваемых при дальнейшем её использовании. В руководстве предполагается, что программа запущена впервые.

Укажите адрес электронной почты, который будет использоваться для отправки извещений и восстановления утерянных ключей.

После этого нужно принять условия соглашения подписчика Let’s Encrypt.

Затем программа запросит доменное имя (или имена). Если вы хотите использовать один сертификат для нескольких доменных имен, укажите их в предложенном поле:

Please enter in your domain name(s) (comma and/r space separated):
example.com www.example.com

Если запуск прошел успешно, на экране появится сообщение:

IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to user@8host.com
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

Выпишите или запомните путь и срок действия сертификата (в примере они выделены красным).

Файлы сертификата

После получения сертификата на сервере появятся следующие файлы:

  • cert.pem: сертификат домена.
  • chain.pem: сертификат цепочки Let’s Encrypt.
  • fullchain.pem: комбинация cert.pem и chain.pem.
  • privkey.pem: закрытый ключ сертификата.

Важно знать место хранения сертификата, так как его нужно будет указать в конфигурации веб-сервера. Файлы хранятся в подкаталоге /etc/letsencrypt/archive, также Let’s Encrypt создаёт символьную ссылку на наиболее актуальный сертификат в каталог /etc/letsencrypt/live/your_domain_name.

Чтобы убедиться, что все файлы существуют, нужно выполнить такую команду:

sudo ls /etc/letsencrypt/live/your_domain_name

Команда покажет список существующих файлов.

Файл fullchain.pem используется в качестве сертификата, а privkey.pem – в качестве ключа. Теперь нужно настроить веб-сервер для поддержки этих файлов.

4: Настройка TLS/SSL на веб-сервере Nginx

Теперь нужно настроить веб-сервер Nginx для обслуживания сертификата.

Если веб-сервер Nginx ещё не установлен, установите его сейчас. Сначала добавьте репозиторий epel при помощи команды:

sudo yum install epel-release

Затем установите Nginx:

sudo yum install nginx

Затем отредактируйте конфигурационный файл Nginx, чтобы настроить поддержку сертификата. По умолчанию он хранится в /etc/nginx/conf.d. Создайте новый файл по имени ssl.conf .

sudo vi /etc/nginx/conf.d/ssl.conf

Вставьте в него следующий код, заменив example.com своим доменом:

server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
root /usr/share/nginx/html;
index index.html index.htm;
# Make site accessible from http://localhost/
server_name localhost;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
}

Сохраните и закройте файл.

Этот код настраивает сервер для поддержки SSL и сертификата Let’s Encrypt.

Примечание: Этот код настраивает поддержку только стандартной страницы Nginx; чтобы обслуживать больше страниц, отредактируйте этот файл.

Теперь нужно настроить переадресацию HTTP-трафика (порт 80) на порт HTTPS (443).

Конфигурационный файл Nginx по умолчанию позволяет быстро добавлять директивы к блоку server для порта 80, создавая файлы в каталоге /etc/nginx/default.d.

Создайте новый файл с именем ssl-redirect.conf и откройте его для редактирования с помощью следующей команды:

sudo vi /etc/nginx/default.d/ssl-redirect.conf

Вставьте в него строку:

return 301 https://$host$request_uri;

Сохраните и закройте файл. Трафик HTTP перенаправляется на порт 443.

Запустите Nginx:

sudo systemctl start nginx

Затем включите Nginx как сервис:

sudo systemctl enable nginx

Теперь веб-сервер поддерживает сертификат TLS/SSL. Протестируйте работу сертификата при помощи браузера.

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

Сертификаты Let’s Encrypt действительны в течение 90 дней, но во избежание ошибок их рекомендуется обновлять каждые 60 дней. На момент написания статьи клиент не оборудован функцией автоматического обновления сертификатов. Этот процесс можно выполнить вручную, просто запустив клиент Let’s Encrypt с использованными ранее параметрами.

Надёжный способ обеспечить своевременное обновление сертификата – это демон cron.

Вместо плагина Standalone используйте плагин Webroot; он позволяет проверить домен сервера, не останавливая веб-сервер. Плагин Webroot добавляет скрытый файл в document root веб-сервера, который необходим Let’s Encrypt CA  для подтверждения домена.

Использование плагина Webroot

Плагин Webroot помещает специальный файл в каталог ./well-known в главном каталоге веб-сервера. После этого Let’s Encrypt может открыть этот файл, чтобы подтвердить домен. В зависимости от настроек сервера вам может понадобиться явно разрешить доступ к каталогу ./well-known.

Чтобы центр сертификации Let’s Encrypt смог получить доступ к каталогу, нужно изменить настройки Nginx.

Откройте ssl.conf:

sudo vi /etc/nginx/conf.d/ssl.conf

В блок server добавьте следующий код:

location ~ /.well-known {
allow all;
}

Если ранее вы изменили путь к root-каталогу, укажите новый путь в директиве root, иначе плагин Webroot не сможет найти этот каталог. По умолчанию главный каталог находится в /usr/share/nginx/html.

Сохраните и закройте файл.

Теперь можно использовать плагин Webroot для обновления сертификата. Указать доменные имена можно при помощи опции –d.

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com

После этого нужно перезапустить Nginx, чтобы получить доступ к обновлённому сертификату.

Конфигурационный файл Let’s Encrypt

Чтобы упростить процесс обновления Let’s Encrypt, создайте конфигурационный файл:

sudo cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini

Откройте его:

sudo vi /usr/local/etc/le-renew-webroot.ini

Раскомментируйте строки email, domains и webroot-path, а затем укажите в них свои данные.

Файл должен выглядеть так (закомментированные строки опущены):

rsa-key-size = 4096
email = you@example.com
domains = example.com, www.example.com
webroot-path = /usr/share/nginx/html

Можно не указывать домен в команде, а просто использовать конфигурационный файл Let’s Encrypt для автоматического внесения домена в команду. Для обновления сертификата можно использовать следующую команду:

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --renew-by-default --config /usr/local/etc/le-renew-webroot.ini

Скрипт для обновления сертификата

Чтобы автоматизировать процесс обновления сертификата, используйте скрипт оболочки, который будет отслеживать срок действия сертификата и обновлять его за 30 дней до истечения этого срока. Скрипт будет запускаться раз в неделю. Таким образом, в случае сбоя cron у вас будет в запасе 30 дней, чтобы снова попытаться обновить сертификат.

Загрузите скрипт и сделайте его исполняемым; предварительно можно просмотреть его содержимое

sudo curl -L -o /usr/local/sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot
sudo chmod +x /usr/local/sbin/le-renew-webroot

Скрипт le-renew-webroot использует домен в качестве аргумента. Если сертификат не нуждается в обновлении, скрипт просто сообщит, сколько дней осталось до истечения срока действия сертификата.

Примечание: Скрипт не запустится, если файла /usr/local/etc/le-renew-webroot.ini не существует. Также нужно убедиться, что в начале конфигурационного файла и в начале сертификата (при его создании) был указан один и тот же домен.

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

sudo /usr/local/sbin/le-renew-webroot
Checking expiration date for example.com...
The certificate is up to date, no need for renewal (89 days left).

После этого нужно отредактировать crontab и добавить в таблицу новую команду, которая будет запускаться раз в неделю.

sudo crontab -e

Добавьте следующую строку:

30 2 * * 1 /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log

Сохраните и закройте файл. Теперь cron будет запускать команду le-renew-webroot каждый понедельник в 2:30 ночи, а вывод команды будет помещён в лог /var/log/le-renewal.log.

Примечание: Больше информации о работе cron можно получить в статье «Автоматизация задач с помощью cron».

Заключение

Теперь NGINX защищен при помощи SSL-сертификата Let’s Encrypt. Не забывайте о том, что клиент Let’s Encrypt до сих пор находится в бета-версии, потому очень важно следить за выходом обновлений и своевременно устанавливать их.

Tags: , , , , ,

Добавить комментарий