HAProxy. Подключение TLS сертификатов LetsEncrypt с помощью ACME — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
(Новая страница: «SINGLE DOMAIN acme.sh installation apt install socat добавим пользака acme adduser --system --disabled-password --disabled-login --home /var/lib…»)
 
 
(не показано 16 промежуточных версий этого же участника)
Строка 1: Строка 1:
SINGLE DOMAIN
+
По словам "Бретанских учёных" в версии HAProxy 2.8 впилили поддержку деплоя сертификатов LetsEncrypt без перезагрузки сервиса. Делаем на связке Debian 12 - HAProxy 3.0
  
acme.sh installation
 
  
apt install socat
+
'''SINGLE DOMAIN'''
  
добавим пользака acme
 
adduser --system --disabled-password --disabled-login --home /var/lib/acme --quiet --force-badname --group acme
 
  
добавим пользака acme в группу haproxy
+
Заранее поставим socat
adduser acme haproxy
+
apt install socat
  
создаём папку для acme
 
mkdir /usr/local/share/acme.sh/
 
  
устанавливаем acme скрипт
+
Создаём пользователя
git clone https://github.com/acmesh-official/acme.sh.git
+
adduser --system --disabled-password --disabled-login --home /var/lib/acme --quiet --force-badname --group acme
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/
 
  
создадим acme аккаунт
 
переключимся в пользака acme
 
sudo -u acme -s
 
acme.sh --register-account --server letsencrypt -m finn@megapuper.ru
 
===
 
Account key creation OK.
 
Registering account: https://acme-v02.api.letsencrypt.org/directory
 
Registered
 
ACCOUNT_THUMBPRINT='Xzcw32Ofoos72RlnlJnzPqOre2XzfnGP8Gu8xsWW8zc'
 
===
 
  
вернёмся в рута
+
Добавляем его группу haproxy
exit
+
adduser acme haproxy
  
  
подрихтуем haproxy.conf
+
Создаём папку для acme
====
+
mkdir /usr/local/share/acme.sh/
global
+
 
 +
 
 +
Устанавливаем скрипт
 +
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
 
     stats socket /var/run/haproxy/admin.sock level admin mode 660
     setenv ACCOUNT_THUMBPRINT 'lCufto4sDRTHdmWL0EugFywGV54hBCuTTXvwifi65R4'
+
     setenv ACCOUNT_THUMBPRINT 'ItRz8wdo6Xo5zEmwJlZcVpLckTZH'
 
+
frontend web
+
frontend web
    bind :80
 
 
     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
 +
 
 +
 
 +
Генерируем сертификат
 +
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
  
генерируем сертификат
 
  
переключаемся в пользака acme
+
Проверяем серт на хапроксе
sudo -u acme -s
+
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
  
acme.sh --issue -d haproxy.iwad.ru --stateless --server letsencrypt
 
  
деплоим сертификат на сервер
+
'''WILDCARD'''
sudo -u acme -s
 
  
DEPLOY_HAPROXY_HOT_UPDATE=yes \
+
Для получения wildcard нужно подтверждение владения зоной. Сделаем на примере Cloudflare. Предварительно надо собрать нужные данные из профиля.
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
 
  
проверяем серт на хапроксе
+
Получаем сертификат
echo "show ssl cert /etc/haproxy/ssl/haproxy.iwad.ru" |\
+
sudo -u acme -s
  socat /var/run/haproxy/admin.sock -
+
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
sudo -u acme -s
+
[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
acme.sh --install-cronjob
+
[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
  
проверяем что добавилась строчка
 
21 3 * * * /usr/local/share/acme.sh/acme.sh --cron --home "/var/lib/acme/.acme.sh" > /dev/null
 
  
 +
Деплоим серт на хапрокси
 +
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
  
  
WILDCARD
+
Проверяем на хапроксе
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf
+
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:
  
export CF_Key="8025a22a233169a37e52c5949c258d30a6d0c"
 
export CF_Email="finn@megapuper.ru"
 
  
acme.sh --issue -d *.pushads.biz --server letsencrypt --dns dns_cf
+
Автопродление сертификатов
 +
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
  
деплоим серт на хапрокси
 
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 *.pushads.biz --deploy-hook haproxy
 
  
проверяем на хапроксе
+
https://www.haproxy.com/blog/haproxy-and-let-s-encrypt<br>
echo "show ssl cert /etc/haproxy/ssl/_.pushads.biz.pem" | socat /var/run/haproxy/admin.sock -
+
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/