Получим и настроим автоматическое обновление бесплатного сертификата SSL для сайта от компании  Lets`Encrypt. Установка на VDS под управлением CentOS 7 с Nginx. Срок сертификата 90 дней. Стабильная и удобная работа с сервисом.

Введение

С января 2017 года Firefox и Chrome маркируют как надежные только сайты с SSL-сертификатами. Это одна из причин по которой следует использовать этот сертификат.

Если коротко, то это защита сайта которая не нужна, но введение некоторых ограничений заставляет использовать её. Хорошо что есть ресурсы которые предоставляют сертификаты бесплатно, сколько времени еще так будет не известно, но мы пока попользуемся.

Мной было найдено два ресурса выдающие бесплатные SSL для сайтов:

  • StartCom — у этого ресурса проблемы с разработчиками браузеров и чем все это закончится не понятно. Удобно что выдается на 3 года и можно установить на любой обычный хостинг.
  • Let’s Encrypt is — все работает и никаких проблем нет. Для установки нужен свой VDS хостинг. Хоть сертификат и выдается на 90 дней, но при настройке автоматического обновления никаких проблем не возникает.

Мой выбор однозначно пал на второй вариант, так как стабильность и понятность для меня самое важное. Использование своего VDS для хостинга сайтов даже рядом нельзя сопоставить с любым обычным хостингом, ни по скорости ни по возможностям.

Установка Certbot от Let’s Encrypt

На сайте компании есть инструкция об установке и использованию. По ссылке вы можете увидеть инструкцию для установки SSL на Nginx под управлением CentOS 7. Можете указать свои системы и получить инструкцию для них.
Nginx + CentOS 7

Для использования Certbot, необходимо сначала включить репозиторий Epel . Как это сделать можете найти в статье VDS настройка CentOS 7.

Установим без вопросов:

yum -y install certbot

Получение бесплатного SSL-сертификата

Не знаю какие ограничения на установку, но я спокойно установил SSL сертификат на домен и 2 его поддомена.

Команда для получения ssl сертификата:

certbot certonly

Когда первый раз получал сертификат открывались окошки на синем фоне, потом только командная строка. Принцип примерно один. Главное внимательно читайте выводимую информацию!

Пример получения сертификата SSL:

certbot certonly
= вывод команды с действиями =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel):sevo44.ru
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for sevo44.ru

Select the webroot for sevo44.ru:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for sevo44.ru: (Enter 'c' to cancel):/web/sites/sevo44.ru/www
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0014_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0014_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
 /etc/letsencrypt/live/sevo44.ru/fullchain.pem. Your cert will
 expire on 2017-07-14. 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

Сертификат успешно получен и указан период его действия.

Установка SSL-сертификата на сайт c Nginx

Вся установка сертификата на сайте под управлением Nginx заключается в правке файла настройки виртуального хоста.

Генерируем  ключ необходимый для настройки:

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

Процесс не быстрый. Ждите.

Все полученные сертификаты будут лежать в папке /etc/letsencrypt/live/ согласно доменным именам вводимым при получении.

Вот пример одного файла настроек сайта для ssl:

# ssl usadebka44.ru
server {
# Переводим на nttps. Добавление http2 - включит работу сайта по этому протоколу!
listen 443 ssl http2;
#listen 80;
server_name usadebka44.ru www.usadebka44.ru;
root /web/sites/usadebka44.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/usadebka44.ru/log/access.log main;
error_log /web/sites/usadebka44.ru/log/error.log;

keepalive_timeout 60;
# Добавляем необходимые строки
ssl_certificate /etc/letsencrypt/live/usadebka44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/usadebka44.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#### ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH";
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_dhparam /etc/ssl/certs/dhparam.pem;

add_header Strict-Transport-Security 'max-age=604800';


location / {
try_files $uri $uri/ /index.php?$args;
}

location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
access_log off;
expires max;
}

location ~ \.php$ {
#fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
try_files $uri $uri/ /index.php?$args;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /web/sites/usadebka44.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/usadebka44.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/usadebka44.ru/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param HTTPS on;

fastcgi_param PHP_VALUE "
max_execution_time = 90
memory_limit = 128M
post_max_size = 32M
upload_max_filesize = 32M
short_open_tag = On
max_input_time = 180
#date.timezone = Europe/Moscow
#always_populate_raw_post_data = -1
";


fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ /\.ht {
deny all;
}
}
# Делаем редирект с http
server {
listen 80;
server_name usadebka44.ru www.usadebka44.ru;
rewrite ^ https://usadebka44.ru$request_uri? permanent;
}

Как вы заметил http2 протокол включается простым добавлением этой записи.

Ну и как обычно проверка и перезапуск Nginx:

nginx -t
systemctl reload nginx.service

Ресурсы проверки SSL и Http2 сайта

Проверим сторонними ресурсами как установился наш SSL-сертификат.

  • SSLChecker — cервис проверки настройки SSL,
  • SSLReport — сервис проверки SSL но более детальный.

Проверим работу http2 протокола:

  • HTTP/2 Test — сервис показывающий проверяющий работу http2.

Продление SSL-сертификата

Есть возможность производить обновления в ручную и в автоматическом режиме.

Ручной режим

Вначале проверим настройку сервиса без обновления сертификатов:

certbot renew --dry-run
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/sevo44.ru.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Starting new HTTPS connection (1): acme-staging.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for sevo44.ru
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0008_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0008_csr-certbot.pem
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
 /etc/letsencrypt/live/sevo44.ru/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)

Видим что все хорошо.

Для обновления всех сертификатов достаточно запустить команду:

certbot renew 
= вывод команды =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/sevo44.ru.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
 /etc/letsencrypt/live/sevo44.ru/fullchain.pem (skipped)
No renewals were attempted.

Так как необходимый минимальный срок обновления не подошел то выдало сообщение о ненадобности обновления.

Автоматический режим

Для автоматического обновления нам достаточно добавить необходимую строчку в crontab:

mcedit /etc/crontab
= необходимое добавление =
30 2 * * 1 /usr/bin/certbot renew >> /var/log/letsencrypt/cron-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx

Согласно этой строчке команда будет выполняться каждый понедельник в 2:30 после выполнения произойдёт reload nginx и весь результат будет записан в лог файл.

Результат

Вот и работает наш сайт на SSL сертификате. Обновление происходит автоматически. В случае если обновление не произойдет вы всегда получите сообщение на почту. Работать с сервисом удобно и понятно.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!

  • https://www.facebook.com/app_scoped_user_id/1973063432917044/ Антон Лазев

    Спасибо! Все доходчиво

  • http://vk.com/id63130413 Алексей Долотов

    Пожалуйста. Рад что получается писать понятным языком.