Настройка Nginx + SSL от Let’s Encrypt на Debian 8

Apr 25, 2016 21:51 · 554 words · 3 minute read nginx ssl

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.

tweet Share