Сертификаты Lets Encrypt на старых серверах

Благодаря Let’s Encrypt, стало гораздо проще получать сертификаты для доменов и уверенно двигаться в ногу со временем навстречу HTTP/2. Несколько тормозит прогресс наличие огромного количества необновляемых в силу ряда причин серверов под управлением старых операционных систем. Не будем вдаваться в моральные и прочие аспекты обслуживания этого разношерстного зоопарка, в рамках данной статьи рассмотрим, как условно безболезненно получать и обновлять сертификаты для доменов на таких железках.

Итак, пытаясь установить certbot на систему типа debian 6, можно столкнуться с очень старыми версиями требуемых зависимостей (хотя бы тот же python 2.6)

Вероятно, можно перенести половину софта из других реп или наколдовать из исходников, но одним из решений является проксирование нескольких запросов к домену на другой сервер (с более свежими версиями операционных систем) и перекладывание получаемых сертификатов назад. Данный способ не является единственно верным и возможно вообще вредный. Ну в общем, как всегда, делайте на свой страх и риск. Я предупредил ;-)

При проверке принадлежности домена необходимо разрешить запись в папке, которая будет смотреть по ссылке domain/.well-known/. В обычном случае делаем в конфиге nginx что-то вроде
location ~* ^/.well-known {
root /var/www/certs;
}

а потом указываем скрипту путь до этой папки при первоначальном запуске
/home/certbot-auto certonly --webroot -w /var/www/certs -d domain

Наш сервер не может самостоятельно получить сертификат, поэтому делаем проксирование на другой сервер
location ~* ^/.well-known {
proxy_pass http://ip.from.new.server:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

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

Далее необходимо взять fullchain.pem и privkey.pem и перенести на наш целевой старенький сервачок. Можно делать это руками раз в 90 дней (лучше конечно заранее). А можно автоматизировать скриптом вроде такого

domain="ВСТАВИТЬ ДОМЕН"
host_ip="ВСТАВИТЬ IP"

ssl_remote_dir="/etc/ssl/$domain"
ssl_local_dir="/etc/letsencrypt/live/$domain"

scp -r $ssl_local_dir/ $host_ip:/tmp/
ssh $host_ip 'cp /tmp/'$domain'/fullchain.pem '$ssl_remote_dir'/ ; cp /tmp/'$domain'/privkey.pem '$ssl_remote_dir'/ ; nginx -s reload'

Правда надо будет еще ключи добавить для ssh авторизации на целевом сервере, для этого необходимо сделать ssh-copy-id IP-старого-сервера (если ключей еще не делали, ssh-keygen <Нажать enter N раз>)

P.S. таким образом можно собрать в одном месте на свежем сервере сертификато-продлеватель для большого числа «старых» серверов. Для этого нужно опустить директиву server_name на свежем сервере и для всех доменов указывать одну и ту же папку (получается default_server с неограниченным количеством спроксированных доменов).