Сообщение об ошибке
No subject alternative names matching IP address 127.0.0.1 found
Также выводится как
- java.security.cert.CertificateException: No subject alternative names matching IP address 127.0.0.1 found
Адрес берётся из вашего URL; JDK 21 и более поздние версии добавляют в начало текста исключения «(certificate_unknown) ». Для DNS-имён хостов сообщение выглядит так: «No subject alternative DNS name matching <host> found.»
Java (JSSE HostnameChecker) — URL host is an IP address that is not an IP SAN of the certificate
Что это означает
Хост в URL — IP-адрес, а в расширении альтернативного имени субъекта (SAN) сертификата нет записи типа IP с таким же адресом. Java (согласно RFC 6125) сравнивает IP-адреса только с записями IP SAN; DNS-имена и общее имя (CN) никогда не совпадают с адресом.
Почему это происходит
Клиент подключается по IP-адресу
частоФайлы конфигурации, URL JDBC и реестры сервисов, в которых хранятся IP-адреса вместо имён хостов.
Трафик внутри кластера на адреса подов или узлов
частоОбнаружение сервисов, которое выдаёт IP-адреса (подов, узлов, виртуальных машин в облаке), тогда как в сертификатах указаны имена сервисов.
Сертификат предназначен для доступа по IP, но в нём нет IP SAN
иногдаУказывать IP-адрес в общем имени (CN) бесполезно: адрес должен быть записью типа IP в subjectAltName.
Как исправить
- 1.
Подключайтесь по DNS-имени, указанному в сертификате
Используйте имя хоста и настройте, чтобы оно разрешалось в нужный адрес; тогда проверка имени хоста пройдёт успешно.
bash # Use the DNS name from the certificate; map it to the IP where needed echo "10.0.0.5 api.example.com" | sudo tee -a /etc/hosts curl -sI https://api.example.com/ - 2.
Выпустите сертификат с IP SAN
Если клиенты обязаны обращаться по адресу, добавьте его как запись типа IP (публичные CA выпускают такие сертификаты редко, частные CA могут).
bash # Or issue the certificate with the IP address as an IP SAN entry 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 -certreq -alias server -keystore server.p12 -ext "SAN=dns:api.example.com,ip:10.0.0.5" -file server.csr