себе на память: Let's Encrypt, wildcard, named

Обсуждаем сайт и форум.

Модератор: f0s

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Alex Keda » 2020-08-23 11:34:14

собственно, впервые заюзал wildcard Let's Encrypt, соответственно сегодня ночью оно должно было продлится, но получил такое письмо:

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

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/host-food.ru.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Non-interactive renewal: random delay of 300.024992284833 seconds
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Attempting to renew cert (host-food.ru) from /usr/local/etc/letsencrypt/renewal/host-food.ru.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.'). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /usr/local/etc/letsencrypt/live/host-food.ru/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

All renewal attempts failed. The following certs could not be renewed:
  /usr/local/etc/letsencrypt/live/host-food.ru/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
ну понятно, выпускалось вручную, с проверкой через ДНС запись. чё-то я об этом не подумал когда делал

соответственно надо какой-от скрипт который будет записи в ДНС делать и менять по команде --manual-auth-hook


проверяем что стоят уведомления на вторичные сервера:

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

options {
      ...........
      also-notify {91.227.16.10; 91.227.18.2;};
};
разрешаем обновления для зоны (хотя, может правильней вынести Let's Encrypt запись в отдельную зону. потом, может переделаю)

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

zone "host-food.ru"     { type master; file "/usr/local/etc/namedb/master/host-food.ru"; allow-update { localhost; }; };
соответственно даём права на изменение

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

chown -R bind:bind /usr/local/etc/namedb/master
пишем скрипт для обновления

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

manager# cat /root/scripts/ssl/let.s.encrypt.dns.auth.sh
#!/bin/sh

if [ -z "$CERTBOT_DOMAIN" ] || [ -z "$CERTBOT_VALIDATION" ]
then
        echo "EMPTY DOMAIN OR VALIDATION"
        exit 1
fi

RECORD="_acme-challenge"

nsupdate -l -v << EOM
update delete $RECORD.$CERTBOT_DOMAIN TXT
update add $RECORD.$CERTBOT_DOMAIN 300 TXT "$CERTBOT_VALIDATION"
send
EOM

sleep 25
в крон скрипт пихаем, раз в неделю

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

manager# cat /root/scripts/ssl/let.s.encrypt.sh
#!/bin/sh

# спим от сукунды до 20 часов
#sleep `jot -r 1 1 72000`

# перевыпускаем сертфикаты
certbot renew --post-hook "service nginx reload" --preferred-challenges=dns --manual-auth-hook /root/scripts/ssl/let.s.encrypt.dns.auth.sh
для проверки гонял скрипт ручками да смотрел меняются ли записи

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

manager# dig @91.227.16.10 txt _acme-challenge.host-food.ru

; <<>> DiG 9.16.5 <<>> @91.227.16.10 txt _acme-challenge.host-food.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19619
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 615108e98860a98159744df25f4229fc61a33b5a49836c33 (good)
;; QUESTION SECTION:
;_acme-challenge.host-food.ru.  IN      TXT

;; ANSWER SECTION:
_acme-challenge.host-food.ru. 300 IN    TXT     "qOZtfw_0b9NJW7FQpAlUmpINbf53H6XtH2EQBG9zQQ8"

;; AUTHORITY SECTION:
host-food.ru.           3600    IN      NS      dns0.host-food.ru.
host-food.ru.           3600    IN      NS      dns1.host-food.ru.

;; ADDITIONAL SECTION:
dns0.host-food.ru.      3600    IN      A       91.227.16.10
dns1.host-food.ru.      3600    IN      A       91.227.18.2

;; Query time: 0 msec
;; SERVER: 91.227.16.10#53(91.227.16.10)
;; WHEN: вс авг. 23 11:34:04 MSK 2020
;; MSG SIZE  rcvd: 211

manager# 
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Alex Keda » 2020-08-23 11:59:34

переделал на отдельную запись. соответственно меняем named.conf

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

zone "host-food.ru"     { type master; file "/usr/local/etc/namedb/master/host-food.ru";};
zone "_acme-challenge.host-food.ru"     { type master; file "/usr/local/etc/namedb/dynamic/_acme-challenge.host-food.ru"; allow-update { localhost; }; };
в зоне прописываем отсылку на другой ДНС сервер (реально, на самого себя - у меня у домена прописаны два слейва а редактирую на мастере)

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

manager# grep acme /usr/local/etc/namedb/master/host-food.ru
_acme-challenge         NS      manager.host-food.ru.
manager# 
создаём файл зоны

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

manager# cat /usr/local/etc/namedb/dynamic/_acme-challenge.host-food.ru
$ORIGIN .
$TTL 3600       ; 1 hour
_acme-challenge.host-food.ru IN SOA manager.host-food.ru. root.host-food.ru. (
                                2020082302 ; serial
                                300        ; refresh (5 minutes)
                                150        ; retry (2 minutes 30 seconds)
                                604800     ; expire (1 week)
                                300        ; minimum (5 minutes)
                                )
                        NS      manager.host-food.ru.
$TTL 300        ; 5 minutes
                        TXT     "gggggggggg"
manager# 
вертаем права взад

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

chown -R root:wheel /usr/local/etc/namedb
chown -R bind:bind /usr/local/etc/namedb/dynamic

для теста рисуем модифицированный скрипт

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

manager# cat /tmp/let.s.encrypt.dns.auth.sh
#!/bin/sh

CERTBOT_DOMAIN=host-food.ru
CERTBOT_VALIDATION=$1

if [ -z "$CERTBOT_DOMAIN" ] || [ -z "$CERTBOT_VALIDATION" ]
then
        echo "EMPTY DOMAIN OR VALIDATION"
        exit 1
fi

RECORD="_acme-challenge"

nsupdate -l -v << EOM
update delete $RECORD.$CERTBOT_DOMAIN TXT
update add $RECORD.$CERTBOT_DOMAIN 300 TXT "$CERTBOT_VALIDATION"
send
EOM

#sleep 25

manager# 
проверяем

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

manager# sh /tmp/let.s.encrypt.dns.auth.sh 11111111111
manager# 
manager# 
manager# dig @8.8.8.8 txt _acme-challenge.host-food.ru

; <<>> DiG 9.16.5 <<>> @8.8.8.8 txt _acme-challenge.host-food.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5747
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.host-food.ru.  IN      TXT

;; ANSWER SECTION:
_acme-challenge.host-food.ru. 299 IN    TXT     "11111111111"

;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: вс авг. 23 11:58:15 MSK 2020
;; MSG SIZE  rcvd: 81

manager# 
ещё раз

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

manager# sh /tmp/let.s.encrypt.dns.auth.sh 1234567890
manager#
manager#
manager# dig @8.8.8.8 txt _acme-challenge.host-food.ru

; <<>> DiG 9.16.5 <<>> @8.8.8.8 txt _acme-challenge.host-food.ru
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8229
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.host-food.ru.  IN      TXT

;; ANSWER SECTION:
_acme-challenge.host-food.ru. 299 IN    TXT     "1234567890"

;; Query time: 53 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: вс авг. 23 11:58:51 MSK 2020
;; MSG SIZE  rcvd: 80

manager# 
всё хорошо. теперь ждём два месяца, чтобы проверилось в реальности, из крона =)
Убей их всех! Бог потом рассортирует...

Demis
прапорщик
Сообщения: 496
Зарегистрирован: 2015-05-25 14:36:32

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Demis » 2020-09-23 18:42:54

Честно говоря мне не нравится такой момент:
Alex Keda писал(а):
2020-08-23 11:59:34
nsupdate -l -v << EOM
Дело в том, что "если все по дефолту в системе", то Ваш скрипт НЕ должен ИЗ крона отработать эту команду.
Когда ручками, то работать будет, т.к. работают переменные окружения пользователя. У крона они обычно закручены, подрезаны...
Там есть минимум два варианта выхода из этой ситуации:
1. Прописать переменные в самом скрипте, но это не комельфо по безопасности.
2. Указать полный путь к файлу:

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

/usr/bin/nsupdate -l -v << EOM
Если нужно менять права в кроне, то аналогично:

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

/usr/sbin/chown -R root:wheel /usr/local/etc/namedb
/usr/sbin/chown -R bind:bind /usr/local/etc/namedb/dynamic
Ну и перепроверить все по тексту скрипта...
Сам, обычно, полные пути прописываю...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Alex Keda » 2020-09-23 18:51:19

у меня на автопилоте уже добавление строки

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

manager# crontab -l | head -2
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

manager# 
полные пути прописывать лень =(
Убей их всех! Бог потом рассортирует...


Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Alex Keda » 2020-10-12 8:14:43

ну, как я уже написал - ленивый я стал =(
Убей их всех! Бог потом рассортирует...

Demis
прапорщик
Сообщения: 496
Зарегистрирован: 2015-05-25 14:36:32

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Demis » 2021-10-06 19:33:30

Просто напоминание про "IdenTrust DST Root CA X3" root expiring on 9/30/2021,
а то на клиентах народ меняет, но забывает, что сервера "они тоже" клиенты...

https://scotthelme.co.uk/lets-encrypt-o ... xpiration/
https://www.opennet.ru/opennews/art.shtml?num=55875

https://letsencrypt.org/2021/10/01/cert ... -help.html
https://letsencrypt.org/docs/dst-root-c ... mber-2021/

Новый сертификат здесь:
https://www.identrust.com/support/downloads
https://www.identrust.com/node/1330

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

себе на память: Let's Encrypt, wildcard, named

Непрочитанное сообщение Alex Keda » 2021-10-06 20:35:32

угу.
--
скрипт кстати успешно работает, но не всегда с первого раза продлевает (раз в неделю запуск)
со второго - всегда, чтобы на третий заход вышло - ещё не было такого
Убей их всех! Бог потом рассортирует...