HAProxy. Подключение TLS сертификатов LetsEncrypt с помощью ACME — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 12 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | По словам "Бретанских учёных" в версии HAProxy 2.8 впилили поддержку деплоя сертификатов LetsEncrypt без перезагрузки сервиса. Делаем на связке Debian 12 - HAProxy 3.0 | |
Строка 24: | Строка 24: | ||
git clone https://github.com/acmesh-official/acme.sh.git | git clone https://github.com/acmesh-official/acme.sh.git | ||
cd acme.sh/ | cd acme.sh/ | ||
− | ./acme.sh --install --no-cron --no-profile --home /usr/local/share/acme.sh | + | ./acme.sh --install --no-cron --no-profile --home /usr/local/share/acme.sh |
ln -s /usr/local/share/acme.sh/acme.sh /usr/local/bin/ | ln -s /usr/local/share/acme.sh/acme.sh /usr/local/bin/ | ||
chmod 755 /usr/local/share/acme.sh/ | chmod 755 /usr/local/share/acme.sh/ | ||
Строка 36: | Строка 36: | ||
Registering account: https://acme-v02.api.letsencrypt.org/directory | Registering account: https://acme-v02.api.letsencrypt.org/directory | ||
Registered | Registered | ||
− | ACCOUNT_THUMBPRINT='' | + | ACCOUNT_THUMBPRINT='ItRz8wdo6Xo5zEmwJlZcVpLckTZH' |
− | + | ||
− | + | ||
+ | Создаём директорию для сертификатов | ||
+ | mkdir /etc/haproxy/ssl | ||
+ | chown haproxy:haproxy /etc/haproxy/ssl | ||
+ | chmod 770 /etc/haproxy/ssl | ||
Строка 44: | Строка 48: | ||
global | global | ||
stats socket /var/run/haproxy/admin.sock level admin mode 660 | stats socket /var/run/haproxy/admin.sock level admin mode 660 | ||
− | setenv ACCOUNT_THUMBPRINT '' | + | setenv ACCOUNT_THUMBPRINT 'ItRz8wdo6Xo5zEmwJlZcVpLckTZH' |
frontend web | frontend web | ||
− | |||
bind :443 ssl crt /etc/haproxy/certs/ strict-sni | bind :443 ssl crt /etc/haproxy/certs/ strict-sni | ||
http-request return status 200 content-type text/plain lf-string "%[path,field(-1,/)].${ACCOUNT_THUMBPRINT}\n" if { path_beg '/.well-known/acme-challenge/' } | http-request return status 200 content-type text/plain lf-string "%[path,field(-1,/)].${ACCOUNT_THUMBPRINT}\n" if { path_beg '/.well-known/acme-challenge/' } | ||
+ | stats socket - активирует API, которое позволяет загрузить сертификат в runtime memory хапрокси<br> | ||
+ | strict-sni - разрешает запустить хапрокси с пустой директорией /etc/haproxy/ssl (когда ещё нет сертификатов)<br> | ||
+ | %[path,field(-1,/)] - использует случайную строку LetsEncrypt, отправленную в рамках запроса HTTP-01 | ||
+ | |||
+ | |||
+ | Рестартим хапрокси | ||
+ | service haproxy restart | ||
Строка 55: | Строка 65: | ||
sudo -u acme -s | sudo -u acme -s | ||
acme.sh --issue -d haproxy.iwad.ru --stateless --server letsencrypt | acme.sh --issue -d haproxy.iwad.ru --stateless --server letsencrypt | ||
− | + | ||
+ | [Mon Jul 15 11:38:34 PM MSK 2024] Your cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/haproxy.iwad.ru.cer | ||
+ | [Mon Jul 15 11:38:34 PM MSK 2024] Your cert key is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/haproxy.iwad.ru.key | ||
+ | [Mon Jul 15 11:38:34 PM MSK 2024] The intermediate CA cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/ca.cer | ||
+ | [Mon Jul 15 11:38:34 PM MSK 2024] And the full-chain cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/fullchain.cer | ||
− | Деплоим сертификат | + | Деплоим сертификат |
sudo -u acme -s | sudo -u acme -s | ||
DEPLOY_HAPROXY_HOT_UPDATE=yes \ | DEPLOY_HAPROXY_HOT_UPDATE=yes \ | ||
DEPLOY_HAPROXY_STATS_SOCKET=/var/run/haproxy/admin.sock \ | DEPLOY_HAPROXY_STATS_SOCKET=/var/run/haproxy/admin.sock \ | ||
DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ | DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ | ||
− | acme.sh --deploy -d iwad.ru --deploy-hook haproxy | + | acme.sh --deploy -d haproxy.iwad.ru --deploy-hook haproxy |
− | + | ||
+ | [Mon Jul 15 11:51:49 PM MSK 2024] The domain 'haproxy.iwad.ru' seems to already have an ECC cert, let's use it. | ||
+ | [Mon Jul 15 11:51:49 PM MSK 2024] Deploying PEM file | ||
+ | [Mon Jul 15 11:51:49 PM MSK 2024] Moving new certificate into place | ||
+ | [Mon Jul 15 11:51:49 PM MSK 2024] Creating new certificate '/etc/haproxy/ssl/haproxy.iwad.ru.pem' over HAProxy stats socket. | ||
+ | [Mon Jul 15 11:51:49 PM MSK 2024] Success | ||
Проверяем серт на хапроксе | Проверяем серт на хапроксе | ||
− | echo "show ssl cert /etc/haproxy/ssl/haproxy.iwad.ru" |\ | + | echo "show ssl cert /etc/haproxy/ssl/haproxy.iwad.ru.pem" |\ |
socat /var/run/haproxy/admin.sock - | socat /var/run/haproxy/admin.sock - | ||
− | + | ||
− | + | Filename: /etc/haproxy/ssl/haproxy.iwad.ru.pem | |
− | + | Status: Used | |
− | + | notBefore: Jul 15 19:38:32 2024 GMT | |
− | + | notAfter: Oct 13 19:38:31 2024 GMT | |
− | + | Subject Alternative Name: DNS:haproxy.iwad.ru | |
− | + | Algorithm: EC256 | |
− | + | Subject: /CN=haproxy.iwad.ru | |
+ | Issuer: /C=US/O=Let's Encrypt/CN=E5 | ||
+ | Chain Subject: /C=US/O=Let's Encrypt/CN=E5 | ||
+ | Chain Issuer: /C=US/O=Internet Security Research Group/CN=ISRG Root X1 | ||
'''WILDCARD''' | '''WILDCARD''' | ||
+ | Для получения wildcard нужно подтверждение владения зоной. Сделаем на примере Cloudflare. Предварительно надо собрать нужные данные из профиля. | ||
Получаем сертификат | Получаем сертификат | ||
sudo -u acme -s | sudo -u acme -s | ||
− | export | + | export CF_Token="" |
− | export | + | export CF_Zone_ID="" |
+ | export CF_Account_ID="" | ||
acme.sh --issue -d *.iwad.ru --server letsencrypt --dns dns_cf | acme.sh --issue -d *.iwad.ru --server letsencrypt --dns dns_cf | ||
+ | |||
+ | [Tue Jul 16 12:13:06 AM MSK 2024] Your cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/*.iwad.ru.cer | ||
+ | [Tue Jul 16 12:13:06 AM MSK 2024] Your cert key is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/*.iwad.ru.key | ||
+ | [Tue Jul 16 12:13:06 AM MSK 2024] The intermediate CA cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/ca.cer | ||
+ | [Tue Jul 16 12:13:06 AM MSK 2024] And the full-chain cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/fullchain.cer | ||
Строка 96: | Строка 125: | ||
DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ | DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ | ||
acme.sh --deploy -d *.iwad.ru --deploy-hook haproxy | acme.sh --deploy -d *.iwad.ru --deploy-hook haproxy | ||
− | + | ||
+ | [Tue Jul 16 12:14:23 AM MSK 2024] The domain '*.iwad.ru' seems to already have an ECC cert, let's use it. | ||
+ | [Tue Jul 16 12:14:23 AM MSK 2024] Deploying PEM file | ||
+ | [Tue Jul 16 12:14:23 AM MSK 2024] Moving new certificate into place | ||
+ | [Tue Jul 16 12:14:23 AM MSK 2024] Creating new certificate '/etc/haproxy/ssl/_.iwad.ru.pem' over HAProxy stats socket. | ||
+ | [Tue Jul 16 12:14:24 AM MSK 2024] Success | ||
Проверяем на хапроксе | Проверяем на хапроксе | ||
echo "show ssl cert /etc/haproxy/ssl/_.iwad.ru.pem" | socat /var/run/haproxy/admin.sock - | echo "show ssl cert /etc/haproxy/ssl/_.iwad.ru.pem" | socat /var/run/haproxy/admin.sock - | ||
+ | |||
+ | Filename: /etc/haproxy/ssl/_.iwad.ru.pem | ||
+ | Status: Used | ||
+ | notBefore: Jul 15 20:13:04 2024 GMT | ||
+ | notAfter: Oct 13 20:13:03 2024 GMT | ||
+ | Subject Alternative Name: DNS:*.iwad.ru | ||
+ | Algorithm: EC256 | ||
+ | Subject: /CN=*.iwad.ru | ||
+ | Issuer: /C=US/O=Let's Encrypt/CN=E5 | ||
+ | Chain Subject: /C=US/O=Let's Encrypt/CN=E5 | ||
+ | Chain Issuer: /C=US/O=Internet Security Research Group/CN=ISRG Root X1 | ||
+ | OCSP Response Key: | ||
+ | |||
+ | |||
+ | Автопродление сертификатов | ||
+ | sudo -u acme -s | ||
+ | acme.sh --install-cronjob | ||
+ | |||
+ | |||
+ | Проверяем что создался кронтаб | ||
+ | 25 0 * * * /usr/local/share/acme.sh/acme.sh --cron --home "/var/lib/acme/.acme.sh" > /dev/null | ||
− | https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf | + | https://www.haproxy.com/blog/haproxy-and-let-s-encrypt<br> |
+ | https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf<br> | ||
+ | https://www.keyvanfatehi.com/2021/09/11/using-acme-sh-in-cloudflare-dns-mode-to-easily-maintain-wildcard-ssl-certificate-for-apache-server-on-ubuntu-20-04/ |
Текущая версия на 17:08, 16 июля 2024
По словам "Бретанских учёных" в версии HAProxy 2.8 впилили поддержку деплоя сертификатов LetsEncrypt без перезагрузки сервиса. Делаем на связке Debian 12 - HAProxy 3.0
SINGLE DOMAIN
Заранее поставим socat
apt install socat
Создаём пользователя
adduser --system --disabled-password --disabled-login --home /var/lib/acme --quiet --force-badname --group acme
Добавляем его группу haproxy
adduser acme haproxy
Создаём папку для acme
mkdir /usr/local/share/acme.sh/
Устанавливаем скрипт
git clone https://github.com/acmesh-official/acme.sh.git cd acme.sh/ ./acme.sh --install --no-cron --no-profile --home /usr/local/share/acme.sh ln -s /usr/local/share/acme.sh/acme.sh /usr/local/bin/ chmod 755 /usr/local/share/acme.sh/
Создадим аккаунт
sudo -u acme -s acme.sh --register-account --server letsencrypt -m admin@iwad.ru Account key creation OK. Registering account: https://acme-v02.api.letsencrypt.org/directory Registered ACCOUNT_THUMBPRINT='ItRz8wdo6Xo5zEmwJlZcVpLckTZH'
Создаём директорию для сертификатов
mkdir /etc/haproxy/ssl chown haproxy:haproxy /etc/haproxy/ssl chmod 770 /etc/haproxy/ssl
Правим конфиг haproxy.conf
global stats socket /var/run/haproxy/admin.sock level admin mode 660 setenv ACCOUNT_THUMBPRINT 'ItRz8wdo6Xo5zEmwJlZcVpLckTZH' frontend web bind :443 ssl crt /etc/haproxy/certs/ strict-sni http-request return status 200 content-type text/plain lf-string "%[path,field(-1,/)].${ACCOUNT_THUMBPRINT}\n" if { path_beg '/.well-known/acme-challenge/' }
stats socket - активирует API, которое позволяет загрузить сертификат в runtime memory хапрокси
strict-sni - разрешает запустить хапрокси с пустой директорией /etc/haproxy/ssl (когда ещё нет сертификатов)
%[path,field(-1,/)] - использует случайную строку LetsEncrypt, отправленную в рамках запроса HTTP-01
Рестартим хапрокси
service haproxy restart
Генерируем сертификат
sudo -u acme -s acme.sh --issue -d haproxy.iwad.ru --stateless --server letsencrypt [Mon Jul 15 11:38:34 PM MSK 2024] Your cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/haproxy.iwad.ru.cer [Mon Jul 15 11:38:34 PM MSK 2024] Your cert key is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/haproxy.iwad.ru.key [Mon Jul 15 11:38:34 PM MSK 2024] The intermediate CA cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/ca.cer [Mon Jul 15 11:38:34 PM MSK 2024] And the full-chain cert is in: /var/lib/acme/.acme.sh/haproxy.iwad.ru_ecc/fullchain.cer
Деплоим сертификат
sudo -u acme -s DEPLOY_HAPROXY_HOT_UPDATE=yes \ DEPLOY_HAPROXY_STATS_SOCKET=/var/run/haproxy/admin.sock \ DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ acme.sh --deploy -d haproxy.iwad.ru --deploy-hook haproxy [Mon Jul 15 11:51:49 PM MSK 2024] The domain 'haproxy.iwad.ru' seems to already have an ECC cert, let's use it. [Mon Jul 15 11:51:49 PM MSK 2024] Deploying PEM file [Mon Jul 15 11:51:49 PM MSK 2024] Moving new certificate into place [Mon Jul 15 11:51:49 PM MSK 2024] Creating new certificate '/etc/haproxy/ssl/haproxy.iwad.ru.pem' over HAProxy stats socket. [Mon Jul 15 11:51:49 PM MSK 2024] Success
Проверяем серт на хапроксе
echo "show ssl cert /etc/haproxy/ssl/haproxy.iwad.ru.pem" |\ socat /var/run/haproxy/admin.sock - Filename: /etc/haproxy/ssl/haproxy.iwad.ru.pem Status: Used notBefore: Jul 15 19:38:32 2024 GMT notAfter: Oct 13 19:38:31 2024 GMT Subject Alternative Name: DNS:haproxy.iwad.ru Algorithm: EC256 Subject: /CN=haproxy.iwad.ru Issuer: /C=US/O=Let's Encrypt/CN=E5 Chain Subject: /C=US/O=Let's Encrypt/CN=E5 Chain Issuer: /C=US/O=Internet Security Research Group/CN=ISRG Root X1
WILDCARD
Для получения wildcard нужно подтверждение владения зоной. Сделаем на примере Cloudflare. Предварительно надо собрать нужные данные из профиля.
Получаем сертификат
sudo -u acme -s export CF_Token="" export CF_Zone_ID="" export CF_Account_ID="" acme.sh --issue -d *.iwad.ru --server letsencrypt --dns dns_cf
[Tue Jul 16 12:13:06 AM MSK 2024] Your cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/*.iwad.ru.cer [Tue Jul 16 12:13:06 AM MSK 2024] Your cert key is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/*.iwad.ru.key [Tue Jul 16 12:13:06 AM MSK 2024] The intermediate CA cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/ca.cer [Tue Jul 16 12:13:06 AM MSK 2024] And the full-chain cert is in: /var/lib/acme/.acme.sh/*.iwad.ru_ecc/fullchain.cer
Деплоим серт на хапрокси
sudo -u acme -s DEPLOY_HAPROXY_HOT_UPDATE=yes \ DEPLOY_HAPROXY_STATS_SOCKET=/var/run/haproxy/admin.sock \ DEPLOY_HAPROXY_PEM_PATH=/etc/haproxy/ssl \ acme.sh --deploy -d *.iwad.ru --deploy-hook haproxy [Tue Jul 16 12:14:23 AM MSK 2024] The domain '*.iwad.ru' seems to already have an ECC cert, let's use it. [Tue Jul 16 12:14:23 AM MSK 2024] Deploying PEM file [Tue Jul 16 12:14:23 AM MSK 2024] Moving new certificate into place [Tue Jul 16 12:14:23 AM MSK 2024] Creating new certificate '/etc/haproxy/ssl/_.iwad.ru.pem' over HAProxy stats socket. [Tue Jul 16 12:14:24 AM MSK 2024] Success
Проверяем на хапроксе
echo "show ssl cert /etc/haproxy/ssl/_.iwad.ru.pem" | socat /var/run/haproxy/admin.sock - Filename: /etc/haproxy/ssl/_.iwad.ru.pem Status: Used notBefore: Jul 15 20:13:04 2024 GMT notAfter: Oct 13 20:13:03 2024 GMT Subject Alternative Name: DNS:*.iwad.ru Algorithm: EC256 Subject: /CN=*.iwad.ru Issuer: /C=US/O=Let's Encrypt/CN=E5 Chain Subject: /C=US/O=Let's Encrypt/CN=E5 Chain Issuer: /C=US/O=Internet Security Research Group/CN=ISRG Root X1 OCSP Response Key:
Автопродление сертификатов
sudo -u acme -s acme.sh --install-cronjob
Проверяем что создался кронтаб
25 0 * * * /usr/local/share/acme.sh/acme.sh --cron --home "/var/lib/acme/.acme.sh" > /dev/null
https://www.haproxy.com/blog/haproxy-and-let-s-encrypt
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf
https://www.keyvanfatehi.com/2021/09/11/using-acme-sh-in-cloudflare-dns-mode-to-easily-maintain-wildcard-ssl-certificate-for-apache-server-on-ubuntu-20-04/