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

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

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

Требования

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

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

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

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

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

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

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

sudo apt-get update

Следующая команда установит git:

sudo apt-get -y install git

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

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

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

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

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

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

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

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

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

Если Nginx ещё не установлен, установите его:

sudo apt-get -y install nginx

Чтобы сервис Let’s Encrypt смог получить доступ к каталогу, отредактируйте настройки Nginx. Откройте стандартный конфигурационный файл (/etc/nginx/sites-available/default) в текстовом редакторе:

sudo nano /etc/nginx/sites-available/default

Добавьте в блок server новый блок location.

Также нужно проверить настройку каталога document root, за который отвечает директива root. По умолчанию каталогом document root является /var/www/html.

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

Перезапустите Nginx:

sudo systemctl reload nginx

Теперь можно использовать плагин Webroot для запроса SSL-сертификата. При помощи флага –d укажите доменное имя; чтобы создать один сертификат для нескольких доменных имён (например, example.com и www.example.com), укажите их в команде. Замените условные данные в команде своими данными.

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com

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

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

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

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

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

Если всё выполнено правильно, программа вернёт:

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

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

Важно! Если вы получили ошибку Failed to connect to host for DVSNI challenge, разблокируйте трафик на портах 80 и 443.

Примечание: В некоторых случаях домен нужно отключить на время получения сертификата.

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

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

  • cert.pem: сертификат домена.
  • li>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 -l /etc/letsencrypt/live/your_domain_name

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

Ключи Диффи-Хеллмана

Чтобы увеличить уровень защиты, нужно сгенерировать ключи Диффи-Хеллмана. Чтобы сгенерировать 2048-битные ключи, введите:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Выполнение команды займёт несколько минут. Ключи DH будут храниться в /etc/ssl/certs/dhparam.pem.

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

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

Отредактируйте конфигурационный файл Nginx; по умолчанию он хранится в /etc/nginx/sites-available/default.

sudo nano /etc/nginx/sites-available/default

Найдите блок server. Закомментируйте или удалите строки, настраивающие этот блок для прослушивания порта 80:

listen 80 default_server;
listen [::]:80 default_server;

Этот блок нужно настроить для прослушивания порта 443. Добавьте в этот блок 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;

Примечание: Не забудьте заменить условный домен example.com своим настоящим доменом.

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

Чтобы разрешить только наиболее безопасные протоколы SSL и настроить поддержку ключей Диффи-Хеллмана, добавьте в этот же блок server следующие строки:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

После этого вне исходного блока server (который прослушивает HTTPS, порт 443), нужно добавить блок server для перенаправления HTTP (порт 80) на HTTPS.

server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}

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

Перезапустите Nginx:

sudo systemctl reload nginx

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

Чтобы проверить настройку, используйте Qualys SSL Labs Report. Откройте в браузере:

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

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

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

Чтобы запустить обновление для всех доменов, запустите:

/opt/letsencrypt/letsencrypt-auto renew

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

Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.

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

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

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

Отредактируйте crontab:

sudo crontab -e

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

crontab entry
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /bin/systemctl reload nginx

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

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

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

6: Обновление клиента Let’s Encrypt

Чтобы обновить локальную копию клиента, перейдите в каталог установки и запустите следующую команду:

cd /opt/letsencrypt
sudo git pull

Заключение

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

Tags: , , , , ,

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