Настройка Nginx + SSL от Let’s Encrypt на Debian 8
Apr 25, 2016 21:51 · 554 words · 3 minute read
Let’s Encrypt – это Certificate Authority (CA) провайдер, который раздает TLS/SSL сертификаты бесплатно. Давайте разберемся, как настроить Nginx на использование ssl-сертификата от Let’s Encrypt!
Получение ssl-сертификата всегда было связано с рядом неудобств, заключающихся в выполнении следующих пунктов:
- формирование CSR-запроса;
- отправка CSR-запроса в СЦ;
- подтверждение владения доменом (ссылка в письме на почту admin@yourhost.ru);
- получение сертификатов на почту;
- подготовка полученных сертификатов к использованию (для Nginx, например, цепочку сертификатов нужно склеивать в один);
- через год — проделать всё заново.
Для автоматизации всего вышеизложенного некоммерческая организация Let’s Encrypt разработала протокол ACME и работающий с ним клиент и создала свой доверенный центр сертификации, который уже признаётся корневыми центрами сертификации.
Итак, приступим. Действия производятся на:
sb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.4 (jessie)
Release: 8.4
Codename: jessie
Загружаем репозиторий:
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Подключать сертификаты будем с помощью плагина Webroot. Для этого открываем файл настроек хоста (например, /etc/nginx/conf.d/example.com.conf
) и в блок server
добавляем следующие строки:
...
# Webroot for Lets Encrypt
location ~ /.well-known {
allow all;
}
...
Проверяем:
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перечитываем конфиг веб-сервера:
service nginx reload
Переходим к созданию сертификата с помощью клиента Let’s Encrypt:
cd /opt/letsencrypt
Запускаем следующую команду:
./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/example --email webmaster@example.com -d example.com -d www.example.com
В данном примере используются следующие опции:
certonly
— скачать сертификат, но не устанавливать (сами разберемся);--webroot-path
— путь к каталогу с сайтом;--email
— почтовый ящик для контактов;-d
— домен (можно указать несколько, еще раз указав-d
).
После создания сертификатов вы увидите примерно следующее:
...
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2016-07-19. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- If you 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
Генерируем ключ Diffie–Hellman:
mkdir /etc/nginx/ssl && openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...
Возвращаемся к настройкам хоста в Nginx (например, /etc/nginx/conf.d/example.com.conf
) и приводим их к следующему виду:
server {
listen 80;
listen 443 ssl;
server_name example.com www.example.com;
root /var/www/example;
if ( $scheme = "http" ) {
return 301 https://$host$request_uri;
}
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
charset utf-8;
# Lets Encrypt Webroot
location ~ /.well-known {
allow all;
}
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$query_string;
}
... # далее ваши специфические настройки
Проверяем:
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезапускаем:
service nginx restart
Процесс обновления сертификатов можно запустить с помощью следующей команды:
./letsencrypt-auto renew
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
-------------------------------------------------------------------------------
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.
Сейчас продление не требуется — сертификат был получен только сегодня.
Для автоматизации добавляем следующую задачу в crontab
:
@monthly /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
А еще теперь можно включить поддержку протокола HTTP2.0 в Nginx!
С опытом пришел более элегантный вариант настройки Nginx + SSL от Let’s Encrypt.