#Что происходит и когда применима инструкция
На одном поддомене TLS-рукопожатие прерывается, хотя основной сайт и соседние поддомены работают. Ошибка может возникать ещё до HTTP-запроса из-за отдельного сертификата, несовместимой TLS-конфигурации, особого порта или клиентских сертификатов.
#Основные причины и их признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Отдельный виртуальный узел настроен неверноПоддомен обслуживает собственный блок HTTPS и сертификат. | Сбой есть только у api.example.com, www работает | Сравните конфигурации и SNI. |
| Сервис требует клиентский сертификатМеханизм mTLS может быть включён только для отдельного API. | В логах certificate_required или handshake failure | Проверьте политику клиента и сервера. |
| DNS направляет на другой адресНеработающий узел предлагает другой протокол/сертификат. | Поддомены получают разные A/AAAA или балансировщики | Проверяйте конкретный IP и TLS-терминатор. |
#Пошаговая диагностика и устранение
- Зафиксируйте, на каком этапе обрывОткройте поддомен в браузере и запишите текст ошибки. Если запрос не появляется в журнале приложения, отказ мог возникнуть при TLS ещё до HTTP. Не изменяйте PHP-код или правила rewrite до доказательства, что запрос дошёл до приложения.
- Проверьте DNS проблемного имениЗапросите A и AAAA поддомена. Сравните их с рабочим основным сайтом, но помните: разные IP не обязательно ошибка, если так задумано. Зафиксируйте адрес каждого сервера, на котором необходимо испытать TLS.
- Терминал с dig, только чтение; подставьте проблемное имяLinux · Терминал (Bash)КомандаТерминал с dig, только чтение; подставьте проблемное имя.
dig +short api.example.com A; dig +short api.example.com AAAA
- Получите диагностическое TLS-сообщениеВыполните
openssl s_clientименно с именем поддомена в-servername, включите показ цепочки и запишите Alert или verify error. Не передавайте закрытые клиентские ключи и не включайте режимы игнорирования TLS.Linux · Терминал (Bash)КомандаТерминал с OpenSSL, безопасное чтение. Укажите реальный порт, если сервис осознанно размещён не на 443.openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts -verify_return_error </dev/null
- Сравните TLS-узлы и сертификатЕсли соединение доходит до Nginx/Apache, сопоставьте
listen,server_name, файлы сертификата и цепочку. Убедитесь, что SAN включает именно этот поддомен или подходящий wildcard. Wildcard одного уровня не защищает вложенные имена вроде a.b.example.com.
- Проверьте поддерживаемые протоколыНа внешней диагностической машине попробуйте TLS 1.2 и TLS 1.3, если OpenSSL их поддерживает. Различайте
handshake failure, ошибку сертификата и соединение, отвергнутое по сети; это не равнозначные причины.Linux · Терминал (Bash)КомандаТерминал с OpenSSL. Результат одной версии TLS не определяет всей совместимости.openssl s_client -connect api.example.com:443 -servername api.example.com -tls1_2 </dev/null
- Проверьте требование mTLSПосмотрите, не требует ли этот виртуальный узел сертификат клиента. Если API по проекту закрыт, правильно установить доверенный клиентский сертификат в приложение, а не отключать mTLS для всего домена.
- Исправьте подтверждённую конфигурациюПосле резервной копии скорректируйте нужный сертификат, SNI или политику TLS. Проверьте синтаксис веб-сервера и примените через штатный reload; при ошибке незамедлительно верните предыдущий рабочий файл.
- Проверьте все адреса и сценарииПовторите подключение к каждому A/AAAA, затем откройте нужный API-метод или страницу, проверьте коды, авторизацию и журнал. Работоспособность основной страницы другого поддомена не заменяет эту проверку.
#Проверка результата
Именно проблемный поддомен проходит TLS с нужным сертификатом и допустимым клиентом, приложение обрабатывает запрос и соседние домены продолжают работать без регрессий.
#Если решить проблему не удалось
Если снаружи соединение обрывается, а серверный журнал пуст, исследуйте внешний CDN, сетевой балансировщик и правила безопасности. Если срабатывает mTLS, сначала проверьте клиента и доверенную цепочку, затем обращайтесь к администратору.