HaProxy и Certbot

Ответить
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

HaProxy и Certbot

Сообщение ya »

Для того чтобы объединить работу HaProxy и Certbot, можно настроить HaProxy для проксирования запросов с использованием SSL сертификатов, которые будут обновляться автоматически с помощью Certbot.

Вот пример того, как это можно сделать:

Установите HaProxy и Certbot на ваш сервер.

Создайте конфигурационный файл для HaProxy, в котором вы настроите проксирование запросов на ваш веб-сервер. В этом файле вы также указываете путь к SSL сертификатам, которые будут использоваться HaProxy. Пример конфигурационного файла:

Код: Выделить всё

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    http
    option  tcplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend http_front
    bind *:80
    redirect scheme https code 301

frontend https_front
    bind *:443 ssl crt /etc/letsencrypt/live/example.com/fullchain.pem
    default_backend http_back

backend http_back
    server webserver 127.0.0.1:8080
Создайте скрипт или cron задание, которое будет автоматически обновлять SSL сертификаты с помощью Certbot. Пример команды для обновления сертификатов:

Код: Выделить всё

certbot renew
Настройте проксирование запросов на ваш веб-сервер через HaProxy, используя SSL сертификаты, которые обновляются Certbot.
Теперь HaProxy будет проксировать запросы на ваш веб-сервер с использованием SSL сертификатов, которые будут автоматически обновляться Certbot.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: HaProxy и Certbot

Сообщение ya »

https://dev.to/phansch/setting-up-ssl-certificates-for-haproxy-with-certbot-bb0

нужно будет сообщить certbot, чтобы он сохранял сертификат до истечения срока его действия и что его следует продлевать, когда мы добавляем к нему новые домены:

Код: Выделить всё

certbot certonly --standalone --agree-tos --non-interactive \
-m yourmail@host.org -d domain --preferred-challenges http \
--http-01-port 9785 --renew-with-new-domains \
--keep-until-expiring
укажем HAProxy направлять все запросы к автономному веб-серверу на правильный порт автономного веб-сервера

Код: Выделить всё

frontend www-https
  bind *:443 ssl crt /etc/haproxy/ssl-certs/cert.pem
  reqadd X-Forwarded-Proto:\ https

  # Let the letsencrypt backend handle requests to the
  # acme-challenge url
  acl letsencrypt-req path_beg /.well-known/acme-challenge/
  use_backend letsencrypt if letsencrypt-req

  # ... etc.
  
Серверная часть letencrypt устанавливает сервер в качестве локального автономного сервера certbot

Код: Выделить всё

backend letsencrypt
   server letsencrypt 127.0.0.1:9785
Обязательно проверьте конфигурацию на haproxy -c -f /path/to/your/haproxy.cfgналичие ошибок.

Теперь мы можем перезагрузить конфигурацию HAProxy и попытаться снова запустить команду certbot сверху. Это должно сработать, но мы еще не закончили.

Следующим шагом будет создание скрипта, который выполнит команду certbot и скопирует сгенерированный сертификат в каталог, где HAProxy его ищет.

Будет вызван скрипт cert_renew, который примет список доменов в качестве аргумента.

Код: Выделить всё

#!/bin/bash

# This script takes a list of domains as arguments
# and will setup a single certificate for all of them.

cert_name="generic_cert"
haproxy_cert_dir="/etc/haproxy/ssl-certs"
email="you@host.org"

domains=""
for domain in "$@"
do
  domains+="-d $domain "
done

certbot certonly --standalone --agree-tos --non-interactive \
-m $email --preferred-challenges http \
--http-01-port 9785 --cert-name $cert_name \
--renew-with-new-domains --keep-until-expiring $domains

mkdir -p $haproxy_cert_dir

# Combine the certificate chain and private key and put it
# into the correct HAProxy directory
cd /etc/letsencrypt/live/$cert_name
cat fullchain.pem privkey.pem > "$haproxy_cert_dir/cert.pem"

echo "Reloading haproxy"
#sudo systemctl reload haproxy
rc-service haproxy reload
Используя его, cert_renew domain1.org domain2.netвы установите один сертификат для обоих доменов /etc/haproxy/ssl-certs/cert.pemи перезагрузите HAProxy.

Далее мы сохраним скрипт /usr/local/bin/cert_renewи настроим cronjob, чтобы он запускался два раза в день:

Код: Выделить всё

5 7,17 * * * root /bin/bash -c '/usr/local/bin/cert_renew domain1.io 2>&1 | /usr/bin/logger -t certbot'
После этого нам нужно будет изменить запись cronjob только при добавлении новых доменов, и нам больше никогда не придется беспокоиться об истечении срока действия сертификатов.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: HaProxy и Certbot

Сообщение ya »

https://www.digitalocean.com/community/tutorials/how-to-secure-haproxy-with-let-s-encrypt-on-ubuntu-14-04

/etc/haproxy/haproxy.cfg

количество одновременных подключений, которые разрешит HAProxy

Код: Выделить всё

 maxconn 2048
максимальный размер генерируемых временных ключей DHE

Код: Выделить всё

 tune.ssl.default-dh-param 2048
Добавьте следующие строки в раздел по умолчанию :

Код: Выделить всё

option forwardfor
   option http-server-close
Опция перенаправления позволяет HAProxy добавлять X-Forwarded-Forзаголовки к каждому запросу, а эта http-server-closeопция уменьшает задержку между HAProxy и вашими пользователями, закрывая соединения, но сохраняя активность.

Код: Выделить всё

frontend www-http
   bind haproxy_www_public_IP:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend
   
   frontend www-https
   bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem
   reqadd X-Forwarded-Proto:\ https
   acl letsencrypt-acl path_beg /.well-known/acme-challenge/
   use_backend letsencrypt-backend if letsencrypt-acl
   default_backend www-backend
   
   backend www-backend
   redirect scheme https if !{ ssl_fc }
   server www-1 www_1_private_IP:80 check
   server www-2 www_2_private_IP:80 check
   
   backend letsencrypt-backend
   server letsencrypt 127.0.0.1:54321
   
haproxy -c -f /etc/haproxy/haproxy.cfg

для debian

Код: Выделить всё

sudo service haproxy restart
для alpine linux

Код: Выделить всё

rc-service restart haproxy
Автоматизация продления сертификата

Код: Выделить всё

#!/bin/sh

SITE=example.com

# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE

# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem

# reload haproxy
service haproxy reload

Код: Выделить всё

sudo chmod u+x /usr/local/bin/renew.sh

Код: Выделить всё

sudo /usr/local/bin/renew.sh
Команда certbot renew, которую мы будем использовать для обновления наших сертификатов, считывает файл конфигурации, который был создан при первом запуске certbot. Нам нужно открыть этот файл и обновить порт, который certbotиспользуется для запуска автономного http-сервера, чтобы он не конфликтовал с haproxy (который уже прослушивает порты 80 и 443). Откройте файл конфигурации в текстовом редакторе:
sudo nano /etc/letsencrypt/renewal/example.com.conf

Код: Выделить всё

http01_port = 54321
Сохраните и закройте файл. Теперь протестируйте процесс продления, указав --dry-run, что мы фактически ничего не продлеваем:

Код: Выделить всё

sudo certbot renew --dry-run
sudo crontab -e

Код: Выделить всё

30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log
Сохранить и выйти. Это создаст новое задание cron, которое будет выполнять команду certbot renewкаждый день в 2:30 ночи. Вывод, полученный командой, будет передан в файл журнала, расположенный по адресу /var/log/le-renewal.log. Если сертификат действительно продлен, --renew-hookсценарий запустится для создания объединенного файла PEM и перезагрузит его haproxy.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: HaProxy и Certbot

Сообщение ya »

https://kevinbentlage.nl/blog/lets-encrypt-with-haproxy/

Запросить новый сертификат

Код: Выделить всё

certbot certonly --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 -d mydomain.com --email me@mydomain.com --agree-tos --non-interactive
--standalone – запустить автономный веб-сервер и прослушивать запросы проверки;
--preferred-challenges http – гарантирует, что certbot будет использовать запрос HTTP для проверки нашего запроса;
–http-01-address 127.0.0.1 – гарантирует, что автономный веб-сервер certbot будет прослушивать только locahost (127.0.0.1);
–http-01-port 9080 – гарантирует, что автономный веб-сервер certbot будет прослушивать порт 9080;
-d mydomain.com — домен, для которого нам нужен сертификат. Вы можете добавить несколько флагов -d , чтобы запросить несколько доменов в одном сертификате. Все домены, которые вы передаете, должны быть преобразованы в ваш HAProxy -сервер.
–email me@mydomain.com — адрес электронной почты, который Lets Encrypt будет использовать для отправки вам уведомлений об истечении срока действия этого сертификата.
--agree-tos – соглашается с условиями использования без вмешательства пользователя.
–non-interactive – Запустите эту команду без вмешательства или ввода пользователя. Обычно, когда вы запускаете certbot, он предоставит вам всю вышеуказанную информацию.

Объединение сертификатов для HAProxy

Код: Выделить всё

#!/bin/bash

# Loop through all Let's Encrypt certificates
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do

  CERTIFICATE=`basename $CERTIFICATE`

  # Combine certificate and private key to single file
  cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem

done
Этот скрипт просматривает все существующие сертификаты Lets Encrypt в /etc/letsencrypt/live и объединяет отдельные файлы в один файл .pem . Этот файл .pem хранится в /etc/haproxy/ssl.

Теперь мы создали этот скрипт, можем сделать его исполняемым и запустить, чтобы подготовить уже запрошенный нами сертификат Lets Encrypt .

Код: Выделить всё

chmod +x /etc/haproxy/prepareLetsEncryptCertificates.sh
sh /etc/haproxy/prepareLetsEncryptCertificates.sh
Если вы посмотрите /etc/haproxy/ssl , вы найдете объединенный файл .pem. Когда вы снова перезагрузите haproxy, у вас должен быть работающий сертификат Lets Encrypt в вашей установке HAProxy !

Чтобы автоматизировать это, мы создаем второй скрипт bash в /etc/haproxy/renewLetsEncryptCertificates.sh.
Этот сценарий в основном вызывает обновление certbot, запускает ранее созданный сценарий объединения и перезагружает haproxy при успешном обновлении сертификата.

Код: Выделить всё

#!/bin/bash

certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepareLetsEncryptCertificates.sh && systemctl reload haproxy.service" --quiet
--standalone – запустить автономный веб-сервер и прослушивать запросы проверки;
--preferred-challenges http – гарантирует, что certbot будет использовать запрос HTTP для проверки нашего запроса;
–http-01-address 127.0.0.1 – гарантирует, что автономный веб-сервер certbot будет прослушивать только locahost (127.0.0.1);
–http-01-port 9080 – гарантирует, что автономный веб-сервер certbot будет прослушивать порт 9080;
--post-hook – команда, которая будет выполнена в случае успешного продления. Мы хотим запустить наш скрипт объединения и автоматически перезагружать HAProxy после каждого обновления;
–quiet – гарантирует, что команда будет выполняться без вывода сообщений.

Чтобы завершить автоматическое продление, мы создаем задание cron, которое запускает сценарий продления ежедневно до полуночи.

Код: Выделить всё

crontab -e
0 0 * * * /bin/sh /etc/haproxy/renewLetsEncryptCertificates.sh
С этого момента этот скрипт будет запускаться ежедневно, и когда certbot узнает, что срок действия некоторых сертификатов скоро истечет, он автоматически продлит их и запустит наш скрипт объединения. Благодаря этому весь процесс полностью автоматизирован.

Когда вы добавите дополнительные сертификаты, они также будут автоматически продлены без вашего вмешательства вручную
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: HaProxy и Certbot

Сообщение ya »

https://github.com/greenhost/certbot-haproxy


https://serverfault.com/questions/939114/haproxy-how-to-process-well-known-before-any-redirects

Код: Выделить всё

frontend http *:80
    acl certbot  path -m beg /.well-known/acme-challenge/
    acl httpsite path -m beg /public/
    use_backend certbot_80 if certbot
    use_backend httpbackend if httpsite
    default_backend redirector

backend redirector
    redirect prefix https://a.test if { req.hdr(host) -m reg ^a\.test(?::.*)?$ }
    redirect prefix https://b.test if { req.hdr(host) -m reg ^b\.test(?::.*)?$ }

backend httpbackend
    server httpserver httpserver.example.com:80

Код: Выделить всё

frontend http *:80
    acl path_certbot path_beg /.well-known/acme-challenge/
    http-request redirect scheme https unless { ssl_fc } || path_certbot
    use_backend certbot_80 if path_certbot
    default_backend std_backend

backend certbot
    server certbot localhost:80

backend std_backend
    <your_backend>
первая строка создает именованное условие (path_certbot), которое будет истинным, если url начинается с /.well-known/acme-challenge/
вторая строка перенаправляет (с помощью HTTP/302) все входящие запросы на https, если только запрос уже не был https, или условие path_certbot активировано
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: HaProxy и Certbot

Сообщение ya »

Обновит действующие сертификаты
certbot renew

Добавление сертификата через апач: предварительно создать конфиг сайта в апаче на 80 порту
certbot --apache -d домен
Ответить