Сообщение об ошибке
No subject alternative names present
Также выводится как
- java.security.cert.CertificateException: No subject alternative names present
JDK 21 и более поздние версии добавляют в начало текста исключения «(certificate_unknown) ». Для DNS-имён хостов сертификат без SAN в Java всё ещё может совпасть по общему имени (CN); другие клиенты (Go, Chrome) сразу отклоняют такие сертификаты.
Java (JSSE HostnameChecker) — certificate without a SAN extension, URL host is an IP address
Что это означает
В сертификате сервера вообще нет расширения альтернативного имени субъекта (SAN), а клиент подключился по IP-адресу. Для IP-адресов Java требует запись IP SAN и никогда не переходит к общему имени (CN), поэтому без расширения SAN сравнивать не с чем. Типичный случай — сертификат, который старый скрипт создал только с CN.
Почему это происходит
Сертификат создан без subjectAltName
частоopenssl req -x509 без -addext subjectAltName, старые команды keytool без -ext SAN или сертификаты, сгенерированные специализированными устройствами.
IP-адрес указан в общем имени (CN)
частоCN=10.0.0.5 выглядит правильно, но при сопоставлении IP-адресов игнорируется; учитывается только запись IP SAN.
Устаревшие инструменты или шаблоны PKI
иногдаШаблоны внутреннего CA, созданные до того, как SAN стал обязательным, по-прежнему выпускают сертификаты только с CN.
Как исправить
- 1.
Убедитесь, что расширения SAN нет
Выведите субъект и subjectAltName; если SAN в выводе нет, сертификат придётся перевыпустить.
bash openssl x509 -in server.pem -noout -subject -ext subjectAltName # "No extensions in certificate" / no SAN output -> the certificate must be reissued - 2.
Перевыпустите сертификат с subjectAltName
Добавьте записи DNS и при необходимости IP; CN оставьте только для отображения.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,IP:10.0.0.5" # keytool (Java keystores) keytool -genkeypair -alias server -keyalg EC -groupname secp256r1 -dname "CN=api.example.com" \ -ext "SAN=dns:api.example.com,ip:10.0.0.5" -keystore server.p12 -storepass changeit