Заметки / Установка сертификатов от Let's Encrypt

SSL, Apache
 Способ получения сертификатов от Let's Encrypt для машины с Apache'ем (nginx'ом) в качестве веб-сервера. Откройте shell-клиент панели управления хостингом или подключитесь к серверу по SSH. Сначала инсталлируем Git.

Ubuntu:
apt-get update
apt-get install git

CentOS:
yum check-update
yum install git

FreeBSD:
pkg update -f
pkg install git

Затем выполните команды:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --agree-dev-preview --server \https://acme-v01.api.letsencrypt.org/directory -a manual auth

Ответьте на все вопросы - это не сложно, за исключением добавления проверочных файлов. Их надо положить в папку "./well-known/acme-challenge" на сайте, связанном с доменом. Однако, если это сделать файлы не будут видны извне, возвращая 404-ошибку. Чтобы её исправить нужно найти файл "../httpd/conf.d/letsencrypt.conf" и временно закомментировать в нём первую строчку:
#Alias /.well-known/acme-challenge/ /usr/local/mgr5/www/letsencrypt/

...после чего перезагрузить веб-сервер. Либо, добавить файлы в "/usr/local/mgr5/www/letsencrypt/". Теперь процедура подтверждения прав на домен может быть завершена, сертификаты получены и положены в директорию "/etc/letsencrypt/live/адрес.сайта":
Press Enter to Continue                                                                                                                      
Waiting for verification...                                                                                                                  
Cleaning up challenges                                                                                                                       
Use of --agree-dev-preview is deprecated.                                                                                                    
                                                                                                                                             
IMPORTANT NOTES:                                                                                                                             
 - Congratulations! Your certificate and chain have been saved at:                                                                           
   /etc/letsencrypt/live/адрес.сайта/fullchain.pem                                                                                             
   Your key file has been saved at:                                                                                                          
   /etc/letsencrypt/live/адрес.сайта/privkey.pem                                                                                               
   Your cert will expire on 20xx-xx-xx. 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        
...где их и нужно оставить:
This directory contains your keys and certificates.

`privkey.pem`  : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem`    : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem`     : will break many server configurations, and should not be used
                 without reading further documentation (see link below).

WARNING: DO NOT MOVE OR RENAME THESE FILES!
         Certbot expects these files to remain in this location in order
         to function properly!

We recommend not moving these files. For more information, see the Certbot
User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.

Включите в панели управления поддержку SSL для домена (если сайт переходит с другого SSL-сертификата то ничего делать не нужно).

Остаётся отредактировать файл виртуального хоста - "../httpd/conf/vhosts/пользователь/адрес.сайта", указав файлы сертификатов и закомментировав предыдущие параметры с этими ключами, если они есть:
    SSLCertificateFile "/etc/letsencrypt/live/адрес.сайта/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/адрес.сайта/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/адрес.сайта/fullchain.pem"

...в случае с nginx - "/etc/nginx/conf.d/default.conf":
    ssl_certificate "/etc/letsencrypt/live/адрес.сайта/fullchain.pem"
    ssl_certificate_key "/etc/letsencrypt/live/адрес.сайта/privkey.pem"
    ssl_trusted_certificate "/etc/letsencrypt/live/адрес.сайта/chain.pem"

Проверяем корректность настроек:
apachectl configtest
nginx -t

...и перезагружаем веб-сервер:
apachectl -k restart
systemctl restart nginx


Обновление сертификатов.

Автоматически обновить сертификаты командой "./letsencrypt-auto renew" ни через cron, ни вручную у меня не получилось. После множества неудач, удалось найти...

...подходящую команду:
cd letsencrypt
./letsencrypt-auto certonly --debug --force-renew -a manual -d адрес.сайта -d www.адрес.сайта

Опять ответить на вопросы и загрузить проверочные файлы. Опция "--force-renew" позволяет не ждать подходящего момента (30 дней до истечения сертификатов), а обновлять их по своему усмотрению, когда удобно. Также нужно не забыть на время проверки файлов сделать сайт доступным по "http": обычно, отключив соответствующее "RewriteRule" в ".htaccess" или настройках виртуального хоста...

...или добавив в условие перенаправления на https постоянное исключение:
RewriteCond %{REQUEST_URI} !^.*acme\-challenge.*$

...для nginx'а можно пробросить проверочные запросы к Апачу:
server {
    listen 80;
    root /var/www/...;
    server_name имя.сайта www.имя.сайта;

    location ~* ^/\.well-known/acme\-challenge {
        proxy_pass         http://127.0.0.1:8080;
        proxy_redirect     off;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    }

    location / {
        return 301 https://имя.сайта$request_uri;
    }
}

P.S. Разобрался с авто-обновлением. Проблема была в том, что если изначально получать сертификаты в ручном режиме, то создаётся соответствующая конфигурация и в дальнейшем сертификаты выписываются по ней. Для исправления этой ситуации нужно отредактировать конфигурационный файл домена. Есть несколько альтернативных способов процедуры, наиболее удобным кажется "webroot". Вот конфиг для него:

/etc/letsencrypt/renewal/oldshelf.ru.conf:
# Options used in the renewal process
[renewalparams]
# Было
#authenticator = manual
# Стало
authenticator = webroot

# Номер аккаунта и сервер остаются без изменений
account = xxx
server = https://acme-v02.api.letsencrypt.org/directory

[[webroot_map]]
# Домены и абсолютный путь до них (без ".well-known/acme-challenge"!)
oldshelf.ru = /path/to/oldshelf.ru
www.oldshelf.ru = /path/to/oldshelf.ru

Осталось повесить на cron:
crontab должен быть с правами root
/path/letsencrypt/letsencrypt-auto renew --post-hook "systemctl restart nginx"

...или для Apache:
/path/letsencrypt/letsencrypt-auto renew --post-hook "apachectl graceful"

"--post-hook" после обновления перезагружает сервер. Сертификаты даются на 3 месяца. Обновиться можно за месяц до истечения срока действия сертификата. Если сделать запрос раньше то ничего не произойдёт. Исходя из этого можно установить данную cron-задачу на срабатывание, например, 2 раза в неделю.

29.03.2019