Thank you for reading this post, don't forget to subscribe!
Let’s Encrypt — центр сертификации, начавший работу в бета-режиме с 3 декабря 2015 года, предоставляющий бесплатные криптографические сертификаты X.509 для TLS-шифрования. Процесс выдачи сертификатов полностью автоматизирован.
Wildcard-сертификат — сертификат открытого ключа, который может использоваться с несколькими поддоменами *.example.ru
Устанавливаем утилиту certbot
1 |
[root@localhost]# yum install certbot |
Получаем SSL сертификат. Тип проверки: TXT-запись в DNS
1 2 3 4 5 6 7 8 |
[root@localhost]# certbot certonly --manual --agree-tos --email postmaster@example.ru --preferred-challenges=dns -d example.ru -d www.example.ru certonly — запрос нового сертификата; manual — проверка домена вручную. preferred-challenges=dns — метод проверки домена через dns. agree-tos — согласие на лицензионное соглашение; email — почтовый адрес администратора домена; d — перечисление доменов, для которых запрашиваем сертификат. |
После чего certbot попросит для проверки прописать TXT-запись для доменных имен.
Прописываем их на нашем dns-сервере, ждем некоторое время, чтоб они прописались и возвращаемся в консоль для подтверждения.
Обязательно надо выждать некоторое время, пока пропишется запись, иначе проверка не пройдет, вы не получите сертификат, и при следующем запросе txt-запись будет другой
Сервис Let’s Encrypt так же выдает Wildcard SSL сертификаты. Для его получения выполним запрос:
1 |
[root@localhost]# certbot certonly --manual --agree-tos --email postmaster@example.ru --preferred-challenges=dns -d example.ru -d *.example.ru |
Срок действия SSL сертификата от Let’s Encrypt ограничена 3 месяцами, по-этому для обхода этого ограничения воспользуемся автоматическим обновлением
Автоматическое продление SSL-сертификата
Ищем путь до certbot:
1 2 |
[root@localhost]# which certbot /usr/bin/certbot |
Запускаем редактирование cron и добавляем строку:
1 2 |
[root@localhost]# crontab -e 0 0 * * 1,4 /usr/bin/certbot renew && systemctl restart nginx |
В данном случае запуск скрипта проверки и продления сертификата (если срок действия сертификата заканчивается) будет происходить по понедельникам и четвергам в 00:00. После чего будет перезапущен NGINX
Часть конфига:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 |
server { listen 443 ssl default_server; include snippets/ssl-params.conf; root /var/www/html; server_name example.ru www.example.ru; index index.php index.html index.htm; ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.ru/chain.pem; ... |
[/codesyntax]
============== ========================= ==================== ==============
SSL-сертификат Let’s Encrypt с автопродлением для NGINX
Устанавливаем пакеты
1 |
$ sudo yum -y install git bc |
Клонируем GitHub репозиторий letsencrypt в каталог /opt/letsencrypt
1 |
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt |
Получаем ssl-сертификат
Переходим в каталог
1 |
$ cd /opt/letsencrypt |
Запускаем скрипт
1 |
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/example.com/public_html -d example.com -d www.example.com |
- example.com, www.example.com — наш домен
- webroot-path=/var/www/example.com/public_html — директория, где расположен сайт
Запускаем приложение letsencrypt-auto без sudo
Если скрипт отработал успешно, мы получим сообщение:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/www.example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/www.example.com/privkey.pem Your cert will expire on 2020-10-26. To obtain a new or tweaked version of this certificate in the future, simply run letsencrypt-auto again. To non-interactively renew *all* of your certificates, run "letsencrypt-auto 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 |
В результате в каталоге /etc/letsencrypt/live/www.example.com/ мы получили следующие файлы
- cert.pem — сертификат
- chain.pem — цепь сертификатов Let’s Encrypt
- fullchain.pem — объединенные сертификаты cert.pem и chain.pem
- privkey.pem — приватный ключ
Сгенерируем ключ Диффи-Хеллмана и сохраним его в каталог /etc/ssl/certs/
1 |
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
Настройка Nginx
В итоге наш конфиг будет выглядеть так
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ sudo nano /etc/nginx/sites-available/example.com.conf server { # redirect server_name example.com www.example.com listen 80; return 301 https://www.example.com$request_uri; } server { listen 443 ssl; server_name example.com www.example.com; # Let's Encrypt certs ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/www.test.ru/chain.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; location ~ /.well-known { allow all; } # The rest of your server block root /usr/share/nginx/html; index index.html index.htm; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } } |
[/codesyntax]
Проверяем и перезагружаем Nginx
1 2 3 4 5 |
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo systemctl reload nginx |
Автопродление ssl-сертификата
Для автопродления используется команда
1 |
$ /opt/letsencrypt/letsencrypt-auto renew |
Т.к. мы недавно обновляли сертификат, то в ответ увидим сообщение
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Requesting to rerun /opt/letsencrypt/letsencrypt-auto with root privileges... Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/www.example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certs are not due for renewal yet: /etc/letsencrypt/live/www.example.com/fullchain.pem expires on 2020-10-26 (skipped) No renewals were attempted. |
[/codesyntax]
Добавим команду для автопродления в crontab
1 2 3 |
$ sudo crontab -e ## Обновление SSL сертификата по понедельникам и четвергам в 2:15 15 2 * * 1,4 /opt/letsencrypt/letsencrypt-auto renew && systemctl restart nginx |
Обновление скрипта letsencrypt
Скачиваем изменения для GitHub репозитория letsencrypt
1 2 |
$ cd /opt/letsencrypt $ sudo git pull |