Получение SSL сертификата от Let’s Encrypt.

Let’s Encrypt - центр сертификации от некоммерческой организации ISRG (Internet Security Research Group) выдающий бесплатные SSL сертификаты для всех желающих. Помимо своей бесплатности у сертификатов Let’s Encrypt есть еще одно преимущество, они выдаются навсегда. Навсегда это конечно образно сказано, вообще-то на три месяца, но если настроить автоматическое обновление, без участия пользователя, то можно сказать что навсегда.

При получении сертификата от Let’s Encrypt от пользователя практически ничего не требуется. Не нужно создавать CSR запросы и ключи, как в случае с сертификатом от COMODO. Весь процесс сводится к установке программы Certbot, после чего все необходимое программа сделает сама, включая проверку домена и получение сертификата.

В этой статье я опишу процесс установки Certbot с дальнейшим получением сертификатов.

Если у вас не установлен пакет для управления репозиториями, то его следует установить.

apt-get install software-properties-common -y

Добавим репозиторий certbot в систему.

add-apt-repository ppa:certbot/certbot -y

Устанавливаем certbot.

apt-get update && apt-get install certbot -y

Перед получением сертификата необходимо немного настроить Nginx, точнее не настроить а добавить в контекст server {} обслуживающий ваш сайт, следующий локейшен.

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

Дело в том, что Certbot создаст скрытый каталог .well-known в коревой директории сайта, для подтверждения владения доменом. Этот каталог должен быть доступен для проверяющего сервера. Вот так выглядит лог доступа проверяющего сервера, когда он обращается к каталогу для проверки.

66.133.109.36 - - [08/Jul/2017:10:37:41 +0300] "GET /.well-known/acme-challenge/9oqufI_Kwnu1yuuCZS6gu5u2tGD-XHD358b0aw8T0vg HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

Перечитаем настройки Nginx.

systemctl reload nginx

Теперь зарегистрируемся в Let’s Encrypt, почту указываем свою.

certbot register --email usermail@mail.com

Certbot предложит прочитать пользовательское соглашение и подтвердить свое согласие, для подтверждения введите "a" и нажмите Enter.

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a

Если хотите разрешить присылать вам письма с уведомлениями нажмите "y", если не хотите нажмите "n".

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: n

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

Чтобы убедиться что все работает как надо, перед получением сертификата можно провести проверку (необязательно).

Опция --dry-run указывает что Certbot будет запущен в тестовом режиме, без сохранения сертификатов на диск. Опция -a указывает на способ проверки сертификата, в нашем случае webroot. Опцией --webroot-path указываем корневой каталог сайта, для которого получаем сертификат. Опция -d задает домен для которого будет выдан сертификат, следует указать два вида домена с www и без.

certbot certonly --dry-run -a webroot --webroot-path=/var/www/test/public -d test.com -d www.test.com

Если все в порядке, то будет следующий ответ.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Cert not due for renewal, but simulating renewal for dry run
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for test.com
Using the webroot path /var/www/test/public for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - The dry run was successful.

Переходим к получению сертификатов. Та же команда что и при проверке, только без --dry-run.

certbot certonly -a webroot --webroot-path=/var/www/test/public -d test.com -d www.test.com

Если порядок, то увидим следующее.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for test.com
Using the webroot path /var/www/test/public for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/test.com/fullchain.pem. Your cert
   will expire on 2017-10-06. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Все cертификаты будут в каталоге /etc/letsencrypt/live/test.com, этот каталог нужно будет указать в конфигурации Nginx.

Добавляем сертификаты в конфигурацию сервера, заодно указываем все остальные нужные для SSL параметры. В этой статье я не буду описывать что к чему, а просто приведу готовую конфигурацию. Более подробно все было описано в статье о переводе Nginx на использование HTTPS.

Примерный конфигурационный файл Nginx.

# Редирект на HTTPS-протокол
server {
    listen 80;
    server_name test.com www.test.com;
    return 301 https://$server_name$request_uri;
    }
	
server {
 
    # Порт который будет слушать nginx
    listen      443 ssl http2;
	
    # Имя сайта
    server_name test.com www.test.com;
	
    # Корневая директория и индексный файл
    root        /var/www/test/public;
    index       index.php;
	
    # Лог-файлы
    access_log  /var/www/test/logs/access.log;
    error_log   /var/www/test/logs/error.log;
 
    # SSL-секция
    
    # Сертификаты и ключи
    ssl_certificate         /etc/letsencrypt/live/test.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/test.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/test.com/chain.pem;
     
    # Diffie-Hellman ключ для DHE - шифров
    ssl_dhparam             /etc/nginx/ssl/dh_2048.pem;
	
    # SSL - сессия
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
 
    # Поддерживаемые протоколы
    ssl_protocols                   TLSv1.2 TLSv1.1 TLSv1;
    
    # Наборы шифров
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    
    # Приоритет серверных шифров
    ssl_prefer_server_ciphers       on;
 
    # Включение HSTS (Strict-Transport-Security)(15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;     	
    
    Далее указываем все остальные параметры..
    .........................................
 
    }

Если есть желание, то можно сгенерировать DH ключ для DHE шифров и подключить его отдельной опцией ssl_dhparam /etc/nginx/ssl/dh_2048.pem;

Создадим каталог /etc/nginx/ssl и перейдем в него.

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

Сгенерируем DH ключ.

openssl dhparam -out dh_2048.pem 2048

Для автоматического продления сертификатов нужно добавить задание в cron. Следующая строка будет запускать обновление сертификатов каждый день два раза в сутки.

0 */12 * * * certbot -q renew

Чтобы добавить задание в cron.

crontab -e

Если cron не использовался, то содержание должно быть таким.

SHELL=/bin/bash
MAILTO=root

0 */12 * * * certbot -q renew

Сохранить изменения в файле Ctrl+O потом нажать Enter и выйти Ctrl+X. Таким образом каждый день certbot будет пытаться обновить сертификаты и когда подойдет срок их обновления они будут обновлены автоматически.

Ответить:

Please enter your comment!
Please enter your name here