Let’s Encrypt — относительно новый Certificate Authority (CA) провайдер, который раздает TLS/SSL сертификаты бесплатно.
На сегодня — Let’s Encrypt еще в открытой бете, однако работает. Не хватает поддержки NGINX и виртуальных хостов — но доделают.
Пока — подключим Let’s Encrypt и NGINX с помощью плагина Webroot.
Схема того, как работает Let’s Encrypt и NGINX:
Установка выполняется на:
# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.1 (jessie) Release: 8.1 Codename: jessie
Устанавливаем необходимые пакеты:
# apt-get update && apt-get install vim bc git
Установа NGINX описана в посте Debian: установка LEMP – NGINX + PHP-FPM + MariaDB.
Содержание
Установка клиента Let’s Encrypt
Загружаем репозиторий:
# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Файлы клиента:
# ls -l /opt/letsencrypt/ total 168 -rw-r--r-- 1 root root 378 Apr 10 15:54 CHANGES.rst -rw-r--r-- 1 root root 621 Apr 10 15:54 CONTRIBUTING.md -rw-r--r-- 1 root root 2848 Apr 10 15:54 Dockerfile -rw-r--r-- 1 root root 3016 Apr 10 15:54 Dockerfile-dev ... -rwxr-xr-x 1 root root 1348 Apr 10 15:54 tox.cover.sh -rw-r--r-- 1 root root 3211 Apr 10 15:54 tox.ini
Настройка Webroot
В блок server {} файла настроек хоста /etc/nginx/conf.d/dev.rtfm.co.ua.conf добавляем:
...
# Lets Encrypt Webroot
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
certonly: скачать сертифкат — но не устанавливать его;--webroot-path: путь к каталогу с приложением;-d: домен, можно указать несколько, еще раз указав-d;
# ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/vhosts/dev.rtfm.co.ua -d dev.rtfm.co.ua Bootstrapping dependencies for Debian-based OSes... Ign http://cloudfront.debian.net jessie InRelease Hit http://cloudfront.debian.net jessie-updates InRelease Hit http://cloudfront.debian.net jessie Release.gpg ... MPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/dev.rtfm.co.ua/fullchain.pem. Your cert will expire on 2016-07-09. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. ... Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Проверяем файлы:
# ls -l /etc/letsencrypt/live/dev.rtfm.co.ua/fullchain.pem lrwxrwxrwx 1 root root 43 Apr 11 15:42 /etc/letsencrypt/live/dev.rtfm.co.ua/fullchain.pem -> ../../archive/dev.rtfm.co.ua/fullchain1.pem
# tree /etc/letsencrypt/archive/
/etc/letsencrypt/archive/
└── dev.rtfm.co.ua
├── cert1.pem
├── chain1.pem
├── fullchain1.pem
└── privkey1.pem
Генерируем ключ Diffie–Hellman:
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time .............+......++*++*
Проверяем:
# file /etc/ssl/certs/dhparam.pem /etc/ssl/certs/dhparam.pem: ASCII text
Настройка NGINX
Снова обновляем конфиг /etc/nginx/conf.d/dev.rtf.co.ua.conf и добавляем поддержку SSL.
Во всех мануалах (и даже у меня) говорится про редирект с 80 порта на порт 443 (SSL) таким образом:
... return 301 https://$host$request_uri; ...
Но возникла проблема с зацикливанием запроса, которая приводила к ошибке «ERR_TOO_MANY_REDIRECTS«, поэтому сделал немного иначе:
server {
listen 80 default_server;
listen 443 ssl;
server_name dev.rtfm.co.ua;
access_log /var/log/nginx/vhosts/rtfm.co.ua-access.log main;
error_log /var/log/nginx/vhosts/rtfm.co.ua-error.log debug;
root /var/www/vhosts/rtfm.co.ua;
if ( $scheme = "http" ) {
return 301 https://$host$request_uri;
}
ssl_certificate /etc/letsencrypt/live/dev.rtfm.co.ua/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dev.rtfm.co.ua/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/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;
location / {
index index.php index.html;
proxy_read_timeout 3000;
...
Проверяем, перезагружаем:
# 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 клиента:
# /opt/letsencrypt/letsencrypt-auto renew Checking for new version... Requesting root privileges to run letsencrypt... /root/.local/share/letsencrypt/bin/letsencrypt renew ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/dev.rtfm.co.ua.conf ------------------------------------------------------------------------------- The following certs are not due for renewal yet: /etc/letsencrypt/live/dev.rtfm.co.ua/fullchain.pem (skipped) No renewals were attempted.
Так как сертификат только выдан — продление не требуется.
На будущее — добавляем две задачи в крон:
# crontab -e
Раз в месяц проверять сертификат и перечитвать конфиг NGINX:
@monthly /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log @monthly /etc/init.d/nginx reload
Для обновления Let’s Encrypt клиента:
# cd /opt/letsencrypt # git pull
Ссылки по теме
How To Secure Nginx with Let’s Encrypt on Ubuntu 14.04


