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) с привилегиями суперпользователя. Как настроить такого пользователя (Шаги №2-3) ?
- Доступ к серверу по ssh
- Настроенная A-запись домена на публичный IP-адрес сервера (или VPS).
- Установленный веб сервер Nginx
Инструкция по настройке Let’s Encrypt в Nginx на Ubuntu 16.04
Шаг № 1 Установка клиента Let’s Encrypt
Для начала использования Let’s Encrypt и получения бесплатного SSL сертификата установим клиент letsencrypt на сервер. Let’s Encrypt проект, который переименован с клиента certboot и входит в состав репозитория Ubuntu 16.04
Обновляем локальные индексы пакетов apt и устанавливаем клиент letsencrypt
1 2 |
sudo apt-get update sudo apt-get install letsencrypt |
Клиент letsencrypt готов к работе.
Шаг № 2 Получаем SSL сертификат
Let’s Encrypt предлагает несколько способов получения сертификата при помощи разных плагинов. На данный момент плагины позволяют только получить сертификат, а настройку сервера для использования этого сертификата нужно выполнить вручную; исключением является плагин для Apache.
Плагины, которые помогают получить сертификат, но не устанавливают его, называются аутентификаторами.
В данном руководстве для создания SSL-сертификата используется плагин Webroot.
Как использовать плагин Webroot
Плагин Webroot помещает специальный файл в каталог /.well-known в каталоге document root, который сервис Let’s Encrypt может открыть для подтверждения через веб-сервер. В зависимости от настройки может понадобиться явно разрешить доступ к каталогу /.well-known.
Открываем стандартный конфигурационный файл или файл настроек своего сайта на Nginx
1 |
sudo nano /etc/nginx/sites-available/default |
Внутри server block добавляем новый location block:
1 2 3 |
location ~ /.well-known { allow all; } |
Также нужно проверить настройку каталога document root, за который отвечает директива root. По умолчанию каталогом document root является /var/www/html.
После добавления нового location block, проверяем настройки nginx командой:
1 |
sudo nginx -t |
Если в результате проверки видим результат:
1 2 |
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
Перезапускаем сервер Nginx для применения изменений, командой:
1 |
sudo service nginx restart |
Когда мы знаем путь webroot, мы можем использовать плагин Webroot, что бы запросить SSL сертификат. мы будем использовать ключ -d для наших доменов. Если вы будете работать с несколькими доменами например (example.com
и www.example.com), нужно включать сертификат для обоих.
Выполним команду:
1 |
sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com |
Правильно укажите путь к своему сайту на сервере ( —webroot-path=/var/www/html ) и названия доменов.
После инициализации клиента letsencrypt нужно будет ввести некоторую информацию.
Вводим свой электронный адрес, который будет использован в случае утери ключей для восстановления:
После этого читаем Соглашение и нажимаем «Agree».
Если все сделано правильно, мы увидим следующую информацию в которой нужно обратиь внимание на путь где сохранен сертификат «/etc/letsencrypt/live/example.com/» и скрок действия.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Output: IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to sammy@digitalocean.com - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-04-17. 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 |
Запомните куда сохранен ваш сертификат.
Если вы увидели ошибку:
1 |
Failed to connect to host for DVSNI challenge |
Это значит, что в настройках firewall на вашем сервере должны быть открыты порты 80 и 443.
Файлы сертификатов
После получения сертификатов, у вас появятся новые PEM файлы:
- cert.pem: Ваш сертификат домена
- chain.pem: сертификат цепочки Let’s Encrypt
- fullchain.pem:
cert.pem
иchain.pem
комбинированные - privkey.pem: Ваш приватный сертификат
Важно знать где хранятся сертификаты, который мы только что создали, так как мы будем их использовать в настройках веб сервера Nginx. Сами файлы помещаются в поддиректорию /etc/letsencrypt/archive. А Let’s Encrypt создает символьную ссылку для них в директорию с указанием вашего домена для которого они создавались. Пример: /etc/letsencrypt/live/your_domain_name Для каждого домена будет создана своя подпака, которую нужно будет указывать в файлах настройки Nginx для каждого из сайтов.
Проверяем, создались ли файлы командой:
1 |
sudo ls -l /etc/letsencrypt/live/your_domain_name |
В выводе должны быть 4 файла, описанных ранее. Далее настроим свой веб-сервер на использование файла fullchain.pem в качестве файла сертификата и файла privkey.pem в качестве файла ключа сертификата.
Генерируем ключи Диффи-Хеллмана
Увеличиваем уровень защиты, для этого нужно сгенерировать ключи Диффи-Хеллмана. Чтобы сгенерировать 2048-битные ключи, выполним команду:
1 |
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
Процесс займет несколько минут и в итоге мы получим 2048-битный ключ в /etc/ssl/certs/dhparam.pem
Шаг № 3 Генерируем TLS/SSL на веб сервере Nginx
У нас уже есть SSL сертификаты, теперь нужно настроить веб сервер Nginx на их использование.
Выполним несколько действий в нашей конфигурации:
- Мы создадим снипет конфигурации, содержащий наши ключи SSL и файлы сертификатов.
- Мы создадим снипет конфигурации, содержащий сильные настройки SSL, которые можно будет использовать с любыми сертификатами в будущем.
- Мы настроим серверные блоки Nginx для обработки SSL-запросов и используем два фрагмента выше.
Этот метод настройки Nginx позволит нам сохранить чистые серверные блоки и поместить общие сегменты конфигурации в модули многократного использования.
Создание снипета с указанием SSL ключа и сертификата
Создадим новый конфигурационный снипет в Nginx в директории /etc/nginx/snippets
Создадим новые снипеты в этой директории используя в первой части названия перед имене домена ssl- и закончим снипет .conf:
1 |
sudo nano /etc/nginx/snippets/ssl-example.com.conf |
В этом файле нужно указать путь к сертификату ssl_certificate и путь к ключу сертификата ssl_certificate_key:
1 2 |
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; |
Добавляем пути, сохраняем и закрываем файл.
Создаем снипет с ключем Диффи-Хеллмана
Создадим снипет который будет использовать 2048-битный ключ. Так этот ключ мы можем использовать для разных сайтов создадим для него отдельный файл:
1 |
sudo nano /etc/nginx/snippets/ssl-params.conf |
Воспользуемся настройками из Chiperli.st для наибольшей безопасности.
В итоге мы должны получить файл следующего ввида, где будет указана директория с нашим 2048-битным ключем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # Disable preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_dhparam /etc/ssl/certs/dhparam.pem; |
Сохраняем и закрываем файл.
Настроим Nginx на использование SSL
Наши снипеты готовы, теперь настроим Nginx на использование SSL. В примере рассмотрим стандартный файл конфигурации для сайтов. Но у себя настройки вносить в существующие конфигурационные файлы для сайтов.
Перед тем как вносить изменения сделаем бекап нашего конфигурационного файла для стандартного сайта, котоыр в Nginx идет по умолчанию.
1 |
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak |
Внесем новые настройки в файл сайта (у себя подставлять файл своего сайта):
1 |
sudo nano /etc/nginx/sites-available/default |
И приводим его к виду (тут показа фрагмент конфигурации):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { # SSL configuration listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; . . . |
Если вы используете firewall не забудь в настройках открыть 443 порт.
Шаг № 4 Применяем изменения в Nginx
Проверяем файл конфигурации на ошибки:
1 |
sudo nginx -t |
Если все настройки выполнены правильно то увидим вывод:
1 2 |
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
Перезапускаем веб сервер Nginx
1 |
sudo service nginx restart |
Проверить свой сайт можно по ссылке в браузере:
1 |
https://www.ssllabs.com/ssltest/analyze.html?d=example.com |
Шаг № 5 Настраиваем автоматическое продление сертификатов
Сертфикаты Let’s Encrypt выдаются на 90 дней. Но рекомендуется обновлять их каждые 60 дней, что бы избежать ошибок. Клиент letsencrypt поддерживает авто обновление сертификатов.
Для обновления сертификатов выполним команду:
1 |
sudo letsencrypt renew |
В связи стем, что мы только что создали сертификаты, они не будут обновлены, а мы увидим информацию, что на данный момент сертификаты не нуждаются в обновлении:
1 2 3 4 5 |
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. |
Что бы автоматизировать это процесс, создадим задания в кроне:
1 |
sudo crontab -e |
и добавим в него
1 2 |
30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log 35 2 * * 1 /bin/systemctl reload nginx |
Мы создали задание которое будет запускать команду авто обновления каждый понедельник в 2:30 ночи и перечитывать конфигурацию Nginx в 2:35 ночи (для использования обновленных сертификатов). Информация о действиях будет сохранят в лог файл /var/log/le-renewal.log
.
Вывод
Теперь мы используем бесплатные SSL сертификаты от Let’s Encrypt. А наши сайты работают на безопасном протоколе https