Let's Encrypt — это бесплатный открытый центр сертификации, разработанный исследовательской группой Internet Security Research Group (ISRG). Сертификатам, выданным Let's Encrypt, сегодня доверяют почти все браузеры.
В этом руководстве мы предоставим пошаговые инструкции о том, как защитить ваш Nginx с помощью Let's Encrypt с помощью инструмента certbot в Ubuntu 16.04.
Содержание
Подготовка
Прежде чем продолжить работу с этим руководством, убедитесь, что вы выполнили следующие предварительные требования:
- У вас есть доменное имя, указывающее на IP-адрес вашего публичного сервера. В этом руководстве мы будем использовать
example.com
. - У вас установлен Nginx, следуя инструкциям по установке Nginx в Ubuntu 16.04 .
Установить Certbot
Certbot — это утилита, написанная на Python, которая может автоматизировать задачи по получению и обновлению SSL-сертификатов Let's Encrypt и настройке веб-серверов.
Сначала установите software-properties-common
, который предоставляет инструмент add-apt-repository
, необходимый для добавления дополнительных PPA.
Обновите индекс пакетов и установите software-properties-common
:
sudo apt update
sudo apt install software-properties-common
После завершения установки добавьте репозиторий certbot PPA в вашу систему, используя следующую команду:
sudo add-apt-repository ppa:certbot/certbot
Обновите список пакетов и установите пакет certbot:
sudo apt update
sudo apt install certbot
Создать сильную группу Dh (Diffie-Hellman)
Обмен ключами Диффи – Хеллмана (DH) — это метод безопасного обмена криптографическими ключами по незащищенному каналу связи. Сгенерируйте новый набор 2048-битных параметров DH для усиления безопасности:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Получение SSL-сертификата Let's Encrypt
Чтобы получить сертификат SSL для нашего домена, мы собираемся использовать плагин Webroot, который работает путем создания временного файла для проверки запрашиваемого домена в каталоге ${webroot-path}/.well-known/acme-challenge
. Сервер Let's Encrypt отправляет HTTP-запросы к временному файлу, чтобы убедиться, что запрошенный домен разрешается на сервер, на котором работает certbot.
Чтобы упростить .well-known/acme-challenge
мы собираемся отобразить все HTTP-запросы для .well-known/acme-challenge
в один каталог /var/lib/letsencrypt
.
Следующие команды создадут каталог и сделают его доступным для записи для сервера Nginx.
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Чтобы избежать дублирования кода, создайте следующие два фрагмента, которые мы собираемся включить во все наши файлы блоков сервера Nginx .
location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Приведенный выше фрагмент включает в себя программы-измельчители, рекомендованные Mozilla , включает сшивание OCSP, строгую безопасность передачи HTTP (HSTS) и обеспечивает выполнение нескольких ориентированных на безопасность заголовков HTTP.
После создания фрагментов откройте блок сервера домена и letsencrypt.conf
фрагмент letsencrypt.conf
как показано ниже:
server {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Активируйте блокировку сервера, создав символическую ссылку с sites-available
на sites-enabled
:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
Перезагрузите конфигурацию Nginx, чтобы изменения вступили в силу:
sudo systemctl reload nginx
Запустите сценарий certbot с подключаемым модулем webroot и получите файлы сертификата SSL:
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Если сертификат SSL получен успешно, certbot напечатает следующее сообщение:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-04-23. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- 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
Теперь, когда у нас есть файлы сертификатов, отредактируйте блок сервера домена следующим образом:
server {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
При конфигурации выше мы форсирование HTTPS и перенаправляем на www
версию домена к non www
версии.
Перезагрузите службу Nginx, чтобы изменения вступили в силу:
sudo systemctl reload nginx
Автоматическое продление SSL-сертификата
Сертификаты Let's Encrypt действительны в течение 90 дней. Чтобы автоматически обновлять сертификаты до истечения срока их действия, пакет certbot создает задание cron, которое будет запускаться дважды в день и автоматически обновлять любой сертификат за 30 дней до истечения срока его действия.
Поскольку мы используем подключаемый модуль certbot webroot после обновления сертификата, нам также необходимо перезагрузить службу nginx. Для этого добавьте --renew-hook "systemctl reload nginx"
в файл /etc/cron.d/certbot
чтобы он выглядел так:
0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
Чтобы протестировать процесс обновления, используйте переключатель --dry-run
:
sudo certbot renew --dry-run
Если ошибок нет, значит процесс продления прошел успешно.
Выводы
В этом руководстве вы использовали клиент Let's Encrypt, certbot, для получения сертификатов SSL для вашего домена. Вы также создали сниппеты Nginx, чтобы избежать дублирования кода, и настроили Nginx для использования сертификатов. В конце руководства вы настроили задание cron для автоматического продления сертификата.
Если вы хотите узнать больше о том, как использовать Certbot, их документация станет хорошей отправной точкой.