Обновлены методы обработки DNS challenge для использования основного домена вместо полного домена. Добавлены улучшенные сообщения для логирования и проверки DNS записей.
This commit is contained in:
@@ -968,7 +968,7 @@ class LetsEncryptManager:
|
|||||||
Обработчик DNS challenge - добавление TXT записи
|
Обработчик DNS challenge - добавление TXT записи
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
validation_domain: Домен для валидации (_acme-challenge.domain.com)
|
validation_domain: Домен для валидации (например, dfv24.com или *.dfv24.com)
|
||||||
validation_token: Токен валидации
|
validation_token: Токен валидации
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -976,13 +976,17 @@ class LetsEncryptManager:
|
|||||||
"""
|
"""
|
||||||
self.logger.info("=== DNS Challenge: Добавление TXT записи ===")
|
self.logger.info("=== DNS Challenge: Добавление TXT записи ===")
|
||||||
|
|
||||||
# Извлекаем поддомен из validation_domain
|
# Извлекаем основной домен из validation_domain
|
||||||
# Формат: _acme-challenge.domain.com или _acme-challenge
|
# Убираем wildcard если есть
|
||||||
parts = validation_domain.replace(f".{self.domain}", "").split(".")
|
base_domain = validation_domain.replace("*.", "")
|
||||||
subdomain = parts[0] if parts else "_acme-challenge"
|
|
||||||
|
# Для DNS-01 challenge всегда используем _acme-challenge
|
||||||
|
subdomain = "_acme-challenge"
|
||||||
|
|
||||||
|
self.logger.info(f"Домен: {base_domain}, Поддомен: {subdomain}")
|
||||||
|
|
||||||
# Добавляем TXT запись
|
# Добавляем TXT запись
|
||||||
success = self.api.add_txt_record(self.domain, subdomain, validation_token)
|
success = self.api.add_txt_record(base_domain, subdomain, validation_token)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
# Ждем распространения DNS
|
# Ждем распространения DNS
|
||||||
@@ -990,8 +994,8 @@ class LetsEncryptManager:
|
|||||||
self.logger.info(f"Ожидание распространения DNS ({wait_time} секунд)...")
|
self.logger.info(f"Ожидание распространения DNS ({wait_time} секунд)...")
|
||||||
time.sleep(wait_time)
|
time.sleep(wait_time)
|
||||||
|
|
||||||
# Проверяем DNS запись
|
# Проверяем DNS запись (используем base_domain для проверки)
|
||||||
if self.verify_dns_record(subdomain, validation_token):
|
if self.verify_dns_record_external(base_domain, subdomain, validation_token):
|
||||||
self.logger.info("DNS валидация готова")
|
self.logger.info("DNS валидация готова")
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@@ -1005,7 +1009,7 @@ class LetsEncryptManager:
|
|||||||
Обработчик очистки DNS challenge - удаление TXT записи
|
Обработчик очистки DNS challenge - удаление TXT записи
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
validation_domain: Домен валидации
|
validation_domain: Домен валидации (например, dfv24.com или *.dfv24.com)
|
||||||
validation_token: Токен валидации
|
validation_token: Токен валидации
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -1013,25 +1017,29 @@ class LetsEncryptManager:
|
|||||||
"""
|
"""
|
||||||
self.logger.info("=== DNS Challenge: Удаление TXT записи ===")
|
self.logger.info("=== DNS Challenge: Удаление TXT записи ===")
|
||||||
|
|
||||||
parts = validation_domain.replace(f".{self.domain}", "").split(".")
|
# Извлекаем основной домен
|
||||||
subdomain = parts[0] if parts else "_acme-challenge"
|
base_domain = validation_domain.replace("*.", "")
|
||||||
|
subdomain = "_acme-challenge"
|
||||||
|
|
||||||
return self.api.remove_txt_record(self.domain, subdomain, validation_token)
|
self.logger.info(f"Домен: {base_domain}, Поддомен: {subdomain}")
|
||||||
|
|
||||||
|
return self.api.remove_txt_record(base_domain, subdomain, validation_token)
|
||||||
|
|
||||||
def verify_dns_record(self, subdomain: str, expected_value: str) -> bool:
|
def verify_dns_record_external(self, domain: str, subdomain: str, expected_value: str) -> bool:
|
||||||
"""
|
"""
|
||||||
Проверка наличия DNS записи
|
Проверка наличия DNS записи через внешний DNS
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
domain: Основной домен
|
||||||
subdomain: Поддомен
|
subdomain: Поддомен
|
||||||
expected_value: Ожидаемое значение TXT записи
|
expected_value: Ожидаемое значение TXT записи
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True если запись найдена
|
True если запись найдена
|
||||||
"""
|
"""
|
||||||
import socket
|
import time
|
||||||
|
|
||||||
full_domain = f"{subdomain}.{self.domain}"
|
full_domain = f"{subdomain}.{domain}"
|
||||||
attempts = self.config.get("dns_check_attempts", 10)
|
attempts = self.config.get("dns_check_attempts", 10)
|
||||||
interval = self.config.get("dns_check_interval", 10)
|
interval = self.config.get("dns_check_interval", 10)
|
||||||
|
|
||||||
@@ -1060,6 +1068,19 @@ class LetsEncryptManager:
|
|||||||
self.logger.warning("DNS запись не найдена после всех попыток")
|
self.logger.warning("DNS запись не найдена после всех попыток")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def verify_dns_record(self, subdomain: str, expected_value: str) -> bool:
|
||||||
|
"""
|
||||||
|
Проверка наличия DNS записи (использует self.domain)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
subdomain: Поддомен
|
||||||
|
expected_value: Ожидаемое значение TXT записи
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True если запись найдена
|
||||||
|
"""
|
||||||
|
return self.verify_dns_record_external(self.domain, subdomain, expected_value)
|
||||||
|
|
||||||
def obtain_certificate(self) -> bool:
|
def obtain_certificate(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Получение нового сертификата
|
Получение нового сертификата
|
||||||
|
|||||||
Reference in New Issue
Block a user