Обновлены методы обработки DNS challenge для использования основного домена вместо полного домена. Добавлены улучшенные сообщения для логирования и проверки DNS записей.

This commit is contained in:
Dmitriy Fofanov
2025-10-29 22:42:49 +03:00
parent 7139ef640f
commit 66db05eed0

View File

@@ -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:
""" """
Получение нового сертификата Получение нового сертификата