Создание SSL-сертификатов для Nginx с Let’s Encrypt под Ubuntu 16.04
Некоммерческий удостоверяющий центр Let's Encrypt, развивающийся под эгидой Linux Foundation - хороший способ получить бесплатный (не самоподписанный!) SSL/TLS-сертификат сроком на три месяца, с возможностью автопродления.
В данном руководстве все действия будут выполняться с помощью официального клиента letsencrypt. Он позволяет создать достоверный сертификат, пригодный для использования в различных приложениях, конкретно же речь пойдет об Nginx.
Требования:
Ubuntu Server 16.04;
пользователь с sudo-привилегиями;
собственно домен;
DNS-запись A вашего домена должна указывать на IPv4-адрес вашего же сервера в Vscale (необходимо для подтверждения владения доменом). Это также в силе для поддоменов (вроде www.example.site).
Шаг 1. Установка необходимого ПО
Обновим локальные индексы менеджера пакетов и установим клиент letsencrypt:
$ sudo apt-get update $ sudo apt-get install letsencrypt -y
Мы пойдём по пути использования Web-root плагина letsencrypt, суть работы которого заключается в том, что он помещает специальный файл в каталог /.well-known (путь указан относительно корня веб-директории), необходимый для валидации вашего домена серверной частью ПО Let's Encrypt.
Если по какой-либо причине ещё не был установлен веб-сервер Nginx - сделайте это с помощью следующих команд:
$ sudo add-apt-repository ppa:nginx/development $ sudo apt-get update $ sudo apt-get install nginx -y
Шаг 2. Подготовка к выпуску сертификата
Откройте конфигурационный файл Nginx:
$ sudo nano /etc/nginx/sites-available/default
внутри серверного блока (server { ...) поместите блок location:
location ~ /.well-known { allow all; }
выйдите из редактора, сохранив изменения, по нажатию Ctrl+X, y, Enter.
Протестируйте конфигурационный файл Nginx на корректность:
$ sudo nginx -t
Перезапустите Nginx:
$ sudo service nginx reload
Шаг 3. Выпуск сертификата
Запустите клиент letsencrypt с повышением и нужными Вам параметрами (/var/www/html - корень вашей веб-директории (по-умолчанию), example.site - домен):
$ sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.site -d www.example.site
После этого вам будет предложено ввести e-mail (для получения уведомлений об истечении сертификата, если вы вдруг не захотите настроить автопродление) и согласиться с лицензионным соглашением.
Итак, теперь у вас есть 4 PEM-файла, относящихся к сертификату - можно вывести их имена командой (example.site - ваш домен):
$ sudo ls -l /etc/letsencrypt/live/example.site
Шаг 4. Генерация параметров Диффи-Хеллмана
Для улучшения безопасности - cгенерируем параметры Диффи-Хеллмана и запишем в файл (процесс займёт некоторое время):
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Шаг 5. Изменение конфигурации Nginx:
Опять отредактируем конфигурационный файл Nginx:
$ sudo nano /etc/nginx/sites-available/default
Привожу проверенный вариант:
server { listen 80; listen [::]:80; server_name example.site; # редирект на HTTPS return 301 https://$server_name$request_uri; server_tokens off; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.site; ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # конфигурация Modern ssl_protocols TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; # HSTS - форсированно устанавливать соединение по HTTPS add_header Strict-Transport-Security "max-age=15768000"; # Разрешение прикрепления OCSP-ответов сервером ssl_stapling on; # Разрешение проверки сервером ответов OCSP ssl_stapling_verify on; root /var/www/html; index index.html index.htm index.nginx-debian.html; # Запрещение выдачи версии nginx в HTTP-заголовках server_tokens off; location / { try_files $uri $uri/ =404; } # для валидации Let's Encrypt location ~ /.well-known { allow all; } }
Для более подробного разъяснения SSL-директив в конфигурации Nginx: документация (на русском) ngx_http_ssl_module.
Преимущества такой конфигурации:
поддержка бинарного протокола HTTP2
HTTPS-only
заточена под максимальную безопасность и современные версии браузеров
A+-рейтинг по версии SSL Labs
Шаг 6 (необязательный). Настройка автопродления сертификата
Вручную продлить сертификат на 3 месяца можно так:
$ sudo letsencrypt renew
Естественно, следует перезапустить Nginx:
$ sudo service nginx reload
Для автоматизации процесса добавим задание в планировщик сron.
Откройте список заданий cron:
$ crontab -e
Добавьте следующие строки:
30 5 * * 1 sudo letsencrypt renew 35 5 * * 1 sudo service nginx reload
Каждый понедельник, в 05:30 будет производиться запуск клиента Let's Encrypt, и в случае необходимости - выполняться продление сертификата.
Заключение
Let's Encrypt выпускает совершенно стандартные сертификаты, без возможности какой-либо настройки. Вся суть состоит в конфигурации веб-сервера Nginx, а именно в нахождении баланса совместимости и безопасности.
Если Вам нужна поддержка более старых устройств/браузеров, рекомендуется воспользоваться Mozilla SSL Configuration Generator. Выберите версии веб-сервера Nginx и openssl, а также, собственно, вариант конфигурации - для старых версий браузеров, среднюю или современную.