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

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

Читайте также: Основы OpenSSL: SSL-сертификаты, закрытые ключи и запросы на подпись

Данный мануал поможет вам получить бесплатный SSL-сертификат для Nginx в Ubuntu 16.04 и настроить его автоматическое обновление.

В мануале вместо стандартного виртуального хоста Nginx будет использоваться отдельный пользовательский виртуальный хост.

Читайте также:  Технические и практические рекомендации к руководствам 8host

Настоятельно рекомендуется создавать индивидуальные файлы виртуальных хостов Nginx для каждого нового домена: это помогает избежать некоторых распространенных ошибок и поддерживать стандартные файлы в качестве резервной конфигурации. Если вы хотите настроить SSL-сертификат с помощью виртуального хоста по умолчанию, следуйте руководству Создание сертификата Let’s Encrypt для Nginx в Ubuntu 16.04.

Требования

  • Сервер Ubuntu 16.04, настроенный согласно этому мануалу.
  • FRDN (в мануале используется условный домен example.com).
  • DNS-записи А для доменов example.com и www.example.com, указывающие на внешний IP-адрес сервера. Полезные советы по настройке хостов можно найти здесь.
  • Веб-сервер Nginx, установленный согласно мануалу Установка Nginx в Ubuntu 16.04.
  • Пользовательский файл виртуального хоста, который можно создать с помощью руководства Настройка виртуальных хостов Nginx в Ubuntu 16.04. В данном мануале будет использоваться файл /etc/nginx/sites-available/example.com.

1: Установка Certbot

Сначала нужно установить на сервер пакет Certbot.

Certbot находится в активной разработке, поэтому пакеты Certbot, предоставляемые репозиторием Ubuntu, очень быстро устаревают. Тем не менее, разработчики Certbot поддерживают свой репозиторий программ для Ubuntu с обновленными версиями, поэтому вместо стандартного можно использовать этот репозиторий.

Сначала добавьте новый репозиторий.

sudo add-apt-repository ppa:certbot/certbot

Нажмите Enter. Обновите индекс пакетов:

sudo apt-get update

Установите пакет Certbot для Nginx:

sudo apt-get install python-certbot-nginx

Клиент Certbot готов к работе. Теперь нужно проверить некоторые параметры Nginx, чтобы настроить SSL для Nginx.

2: Проверка конфигурации Nginx

Certbot должен иметь возможность найти нужный виртуальный хост в конфигурации Nginx, чтобы автоматически настроить SSL. Для этого он ищет директиву server_name, она определяет домен, для которого предназначен сертификат.

Если вы следовали руководству по созданию виртуальных хостов Nginx, у вас есть пользовательский виртуальный хост для вашего домена в /etc/nginx/sites-available/example.com, в котором установлена директива server_name с правильным значением.

Чтобы убедиться, что это так, откройте файл хоста для вашего домена в редакторе:

sudo nano /etc/nginx/sites-available/example.com

Найдите строку server_name:

. . .
server_name example.com www.example.com;
. . .

Если строка выглядит так, как показано выше, вы можете закрыть файл без изменений.

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

sudo nginx -t

Если команда вернула ошибку, откройте файл виртуального хоста и исправьте ошибки (найдите опечатки, добавьте пропущенные символы и т.п.). Затем повторите проверку. Когда ошибок не будет, перезапустите Nginx:

sudo systemctl reload nginx

Теперь Certbot сможет найти правильный файл.

3: Настройка брандмауэра

Если вы включили ufw (как рекомендует руководство по начальной настройке сервера), вам нужно добавить правила для поддержки трафика HTTPS. Для этого  во время установки Nginx регистрирует в брандмауэре несколько профилей.

Чтобы просмотреть текущие параметры, введите:

sudo ufw status

Скорее всего, они будут выглядеть примерно так (поддерживается только трафик HTTP):

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Чтобы добавить поддержку трафика HTTPS, нужно включить профиль Nginx Full, а затем удалить профиль Nginx HTTP:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Снова проверьте состояние брандмауэра:

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Теперь можно запустить Certbot и извлечь сертификат.

4: Получение SSL-сертификата

Certbot предлагает несколько способов получения SSL-сертификата с помощью различных плагинов. Плагин для Nginx автоматически перенастраивает Nginx и обновляет его настройки в случае необходимости.

sudo certbot --nginx -d example.com -d www.example.com

Эта команда запустит certbot с плагином –nginx, а флаг –d позволяет задать доменные имена, для которых предназначен сертификат.

Если вы запускаете certbot впервые, клиент запросит ваш электронный адрес и предложит принять условия использования. После этого certbot подключится к серверу Let’s Encrypt и начнет проверку, чтобы убедиться, что у вас есть права на домен, для которого создается сертификат.

Если проверка пройдет успешно, certbot предложит выбрать параметры HTTPS:

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):

Выберите подходящий вам вариант и нажмите Enter. Конфигурация обновится, веб-сервер Nginx будет перезагружен. В конце настройки certbot сообщит, что процесс прошел успешно и скажет, где лежат файлы сертификата.

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-10-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again with the
"certonly" option. To non-interactively renew *all* of your
certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
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 Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

Сертификаты загружены на сервер, установлены и настроены. Попробуйте перезапустить сайт, используя протокол https://, и обратите внимание на индикатор безопасности в браузере. Обычно если сайт защищен шифрованием, браузер показывает значок зеленого замочка в адресной строке.

Однако если вы протестируете сайт с помощью SSL Labs Server Test, вы получите оценку В из-за слабых параметров Диффи-Хеллмана. Исправьте их, чтобы получить А.

5: Обновление параметров Диффи-Хеллмана

Параметры Диффи-Хеллмана влияют на безопасность первичного обмена ключами между сервером и пользователем. Вы можете улучшить их, создав файл dhparam.pem и добавив его в конфигурацию Nginx.

Создайте файл с помощью openssl.

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

Это может занять несколько минут. Когда файл будет готов, откройте новый файл в каталоге конфигураций Nginx, conf.d:

sudo nano /etc/nginx/conf.d/dhparam.conf

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

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Сохраните и закройте файл. Проверьте его на наличие ошибок:

sudo nginx -t

Если ошибок нет, перезапустите Nginx.

sudo systemctl reload nginx

Теперь можно повторить тест. Ваш сайт должен получить А.

6: Проверка автоматического обновления сертификатов

Сертификаты Let’s Encrypt действительны в течение 90 дней. Пакет certbot обеспечивает своевременное обновление сертификата с помощью сценария /etc/cron.d. этот сценарий запускается два раза в день и автоматически обновит сертификат, если до конца срока его действия остается 30 дней.

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

sudo certbot renew --dry-run

Если команда не вернула ошибок, значит, обновление работает правильно. Certbot будет вовремя обновлять сертификаты и перезагружать Nginx автоматически. Если во время автоматического обновления произойдет сбой, сервис Let’s Encrypt отправит вам сообщение по указанному ранее адресу электронной почты.

Заключение

Теперь вы умеете устанавливать certbot, загружать SSL-сертификаты и настраивать Nginx для использования этих сертификатов.

Больше информации о Certbot можно найти в документации клиента.

Tags: , , , , ,