Скачиваем скрипт certbot-auto
wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
После этого нужно запустить его и он установит нужные зависимости:
sudo ./certbot-auto
Теперь осталось положить этот скрипт куда-нибудь в систему, что потом выполнять его через cron для обновления сертификатов:
sudo cp ./certbot-auto /usr/local/bin/
Настройка web-сервера
При получении сертификата скрипт проверяет что мы управляем доменом, на который получаем серт. Для этого он создает на сервере проверочный файл и выдающий сертификат сервер запрашивает этот файл. Для того, чтобы все работало, на web-сервер должен быть сконфигурирован доступ к скрытой директории /.well-known/acme-challenge/.
В противном случае - скрипт постоянно ругается с ошибкой:
Failed authorization procedure. wiki.autosys.tk (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://wiki.autosys.tk/.well-known/acme-challenge/fsS43RbAQXN2s9rhftKocls_trASu5_7k4nz9kf8CTg
В nginx нужно закомментировать что-то такое:
location ~ /\. { deny all;
Получаем сертификат одной командой
./certbot-auto certonly --webroot -w /var/www -d wiki.autosys.tk
Сертификаты попадают в папку /etc/letsencrypt/live/
Если доменов несколько, то команда будет такая:
./certbot-auto certonly --webroot -w /var/www -d wiki.autosys.tk -d anotherdomain.autosys.tk
Обновляем
Проверяем что все обновляется:
certbot-auto renew --dry-run
Обновляем все сертификаты:
certbot-auto renew
Прописываем сертификаты в nginx
В секцию server сервера прописываем:
listen 443 ssl http2; server_name server.domain.ru; ssl_certificate /etc/letsencrypt/live/pgadmin.adspeed.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/pgadmin.adspeed.ru/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Тут важно, прописать fullchain.pem, а не cert.pem. Если прописать cert.pem, то не будет работать в некоторых браузерах, в частности - Chrome под Android
И включаем сервер HTTP на 80 порту, который понадобится для обновления сертификатов,а также для перенаправления клиентов, пришедших по HTTP на HTTPS:
server { listen 80; #server_name server.domain.ru; root /var/www/; #Enable access to acme files location ~ /\.well-known/acme-challenge/ { allow all; access_log off; log_not_found off; } return 301 https://$host$request_uri; }
Создаем задачу в cron для автообновления
Создаем файлик /etc/cron.weekly/certs_renew :
#! /bin/bash # renew all lets_encrypt_certs sed -i '/^\ *return 301 https/ s/^/#/' /etc/nginx/sites-enabled/default service nginx reload /usr/bin/certbot renew sed -i '/^#\ *return 301 https/ s/^#//' /etc/nginx/sites-enabled/default service nginx reload
И делаем его исполняемым:
chmod a+x /etc/cron.weekly/certs_renew
Скрипт отключает перенаправление с HTTP на HTTPS, перезагружает конфигурацию nginx, обновляет сертификат, включает обратно перенаправление и снова перезагружает конфигурацию nginx.
Ошибки
Однажды, в логах я увидел такое:
Error: couldn't get currently installed version for /opt/eff.org/certbot/venv/bin/letsencrypt....
Оказалось, задача по обновлению сертов не смогла их обновить.
Немного погуглив выискалсь такое решение - нужно удалить пару папок с клиентом certbot (из-под пользователя, который устанавливал его):
sudo rm -rf /opt/eff.org/certbot/ sudo rm -Rf ~/.local/share/letsencrypt
и переустановить certbot:
wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto sudo ./certbot-auto
А когда установочный скрипт начнет спрашивать про домены - просто остановить его, введя “c”.
Discussion