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

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

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

Требования

  • Настроенный сервер Ubuntu 14.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 и bc.

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

sudo apt-get update

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

sudo apt-get -y 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 service nginx stop

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

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

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

Запуск Let’s Encrypt

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

cd /opt/letsencrypt

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

./letsencrypt-auto certonly --standalone

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

После запуска 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

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

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

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

Если веб-сервер Nginx ещё не установлен, установите его при помощи команды:

sudo apt-get install nginx

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

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

Найдите блок server, он имеет примерно такой вид:

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}

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

listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

Этот блок нужно настроить для прослушивания порта 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_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

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

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

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

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

Чтобы обновить настройки, перезапустите веб-сервер:

sudo service nginx restart

Теперь веб-сервер поддерживает сертификат 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.

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

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

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, чтобы получить доступ к обновлённому сертификату.

sudo service nginx reload

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

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

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

Откройте файл для редактирования:

sudo nano /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 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: , , , , ,

2 комментария

  • Айдар Валеев says:

    А подскажите теперь (если честно, сожалею немного, что воспользовался Вашей статьёй, а не инструкцией от ДО по установке через Certbot – увидел позже (но может обоснуете преимущества, описанные в Вашей статье), когда я добавлю новый сайт на сервер, мне как лучше поступить?

    1. Делать новый сертификат (правильно я понял, обновлять действующий нельзя по Вашей инструкции?). И как тогда настраивать автообновление?
    2. заново всё настраивать (тогда как правильно удалить текущий сертификат?) – всё с нуля с прописыванием заново всех доменов плюс нового домена?

  • Айдар Валеев says:

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

    Создал новый сертификат для отдельного сайта. Вопрос: как сделать, чтобы обновлялись 2 (и более) сертификата в одном скрипте – достаточно просто перечислить через пробелы в файле le-renew-webroot.ini новые домены или нужно что-то ещё?

    Здесь вообще отвечают на комменты или написали статью по SEO и забыли?)

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