Скачиваем скрипт 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”.

Enter your comment. Wiki syntax is allowed:
 
  • linux_faq/lets_encrypt_certificates_on_ubuntu.txt
  • Last modified: 2019/08/23 08:01
  • by admin