Перейти к содержимому
ecdsa.com
Java (JSSE HostnameChecker)Java

Сообщение об ошибке

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.

Почему это происходит

Как исправить

  1. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей