HAProxy (интеграция с Let's Encrypt)
18.03.2017

Вторая часть про балансировщик HAProxy и автоматизацию получения SSL-сертификатов. [часть 1]

Установка certbot'а:

# wget "https://dl.eff.org/certbot-auto"
# chmod a+x certbot-auto
# mv ./certbot-auto /usr/local/bin/

Выберите любую папку, которая будет web-корнем (я взял /root):

# mkdir -p /root
# cd "$_"
# nohup python -m SimpleHTTPServer >/dev/null 2>&1 &

SimpleHTTPServer работает на 8000 порту. Идем в конфиг HAProxy:

frontend http
    bind *:80
    acl is_certbot path_beg /.well-known/acme-challenge
    acl is_www hdr_beg(host) -i www.
    acl is_dev hdr_beg(host) -i dev.
    http-request redirect prefix http://%[hdr(host),regsub(^www\.,,i)] if is_www
    redirect scheme https if !{ ssl_fc } !is_certbot !is_dev
    use_backend lo1 if is_certbot
    use_backend be1 if is_dev
backend lo1
    balance leastconn
    option httpclose
    server lo1node1 localhost:8000

Это измененный конфигурационный файл из первой статьи. Добавилось только is_certbot. Итак, запускаем:

# certbot-auto certonly --email "email@site.com" --agree-tos \
    --webroot -w /root -d site.com -d www.site.com

Все готово! Для HAProxy нужен pem-сертификат, поэтому не забывайте с'concat'ить сертификат и ключ. Ну, и стандартный reload:

# /etc/init.d/haproxy reload

Автоматизация всего этого

#!/usr/bin/env bash

cd "`dirname "$0"`"

# перебираем все сертификаты и ищем сертификаты, срок которых подходит к концу
for cert in *.pem; do
    d=`cat "$cert" | openssl x509 -noout -dates | cut -d'=' -f2- | tail -1`
    ds=`date +'%s' -d "$d"`
    dymd=`date +'%Y-%m-%d' -d "$d"`
    # если остается меньше 30 дней, то ...
    days=30
    dd=$((days * 86400))
    if [ $((ds - dd)) -lt `date +'%s'` ]; then
        echo "[ERR] ${cert}: SSL left less than ${days} days (${dymd})"
        site=`basename "$cert" .pem`
        echo "Updating ... ${site}"
        # ... обнови сертификаты и ...
        certbot-auto certonly --email "email@site.com" --agree-tos --webroot -w /root -d "$site" -d "www.${site}"
        cat /etc/letsencrypt/live/"$site"/fullchain.pem /etc/letsencrypt/live/"$site"/privkey.pem > "$cert"
        # ... перезагрузи HAProxy
        /etc/init.d/haproxy reload
        sleep 2
    else
        echo "[OK] ${cert}: SSL left more than ${days} days (${dymd})"
    fi
done
Теги → haproxy ssl certbot encryption