lets-encrypt-with-nginx

SSL Let’s Encrypt на Centos 7 + nginx

Intro
Все хотят чего то бесплатно.
Но для бесплатно нужно немного поработать своими силами.
Сейчас все больше и больше сайтов переходят на сертификаты CA Let’s Encrypt.
Рассмотрим детали заказа и установки сертификата.
С чем я работаю.

1
2
3
CentOS Linux release 7.3.1611 (Core)
Linux it-svc.com.ua 3.10.0-514.2.2.el7.x86_64 #1
SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Step 1
Нужно установить небольшую утилиту под названием certbot. для ее установки нужно подключить репозиторий epel
Установка производиться командой:

1
yum install -y epel-release

После успешной установки репозитория можно приступить к установке утилиты certbot

1
yum install certbot

Stem 2
Я полагаю что nginx у вас установлен и настроен на прослушивание 80 порта. В конфигурацию Nginx нужно внести следующую локацию

1
2
3
location ~ /.well-known {
        allow all;
}

После проверить синтаксис на ошибки

1
nginx -t

и перезапустить сервис

1
systemctl restart nginx

или

1
systemctl reload nginx

Step 3
Запрос на создание сертификата

1
certbot certonly -a webroot --webroot-path=/usr/share/nginx/it-svc.com.ua/www -d example.com -d www.example.com

who is?
webroot-path=/usr/share/nginx/it-svc.com.ua/www — директория расположения корневого каталога сайта
-d it-svc.com.ua -d www.it-svc.com.ua — домен для которого мы хотим получить сертификат www и без www.
Директория хранения сертификатов и конфигурации /etc/letsencrypt/
Можете проверить существование сертификатов выполнив команду

1
ls -l /etc/letsencrypt/live/it-svc.com.ua

Если же их там нет, то сертификаты не созданы.
Повысим безопасность сформировав Diffie-Hellman Group (протокол Диффи — Хеллмана)

1
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Step 4
Подключим все в конфигурацию nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 443 ssl;
    server_name  it-svc.com.ua;
    ssl_certificate     /etc/letsencrypt/live/it-svc.com.ua/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/it-svc.com.ua/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        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;

Сохраните и проверьте синтаксис nginx

1
nginx -t

Step 5
Время жизни сертификата 3 месяца. И что бы не перевыпускать его вручную нужно создать задание crontab

1
2
3
crontab -e
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx