Они могут быть сформулированы как отдельные вопросы для ясности, но все они связаны с одной и той же проблемой.
Как разрешены имена серверов сертификатов SSL?
Почему браузеры, похоже, используют поле CN сертификата, но механизм Java, похоже, только смотрит только на "субъектные альтернативные имена"?
Можно ли добавлять альтернативные имена сертификату SSL с помощью keytool? Если нет, использует openSSL вместо этого хороший вариант
Немного фона: Мне нужно, чтобы главный сервер связывался с несколькими серверами с помощью HTTPS. Очевидно, что мы не хотим покупать SSL-сертификаты для каждого сервера (их может быть много), поэтому я хочу использовать самозаверяющие сертификаты (я использую keytool для их создания). После того, как я добавлю сертификаты как доверенные в ОС, браузеры (IE и Chrome) с радостью согласуют соединение как надежное. Однако даже после добавления сертификатов в Java cacerts Java по-прежнему не будет принимать соединение как доверенное и выдает следующее исключение:
Вызывает: java.security.cert.CertificateException: нет альтернативных имен объектов настоящее время at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:142) at sun.security.util.HostnameChecker.match(HostnameChecker.java:75) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509T rustManagerImpl.java:264) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted( X509TrustManagerImpl.java:250) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Clien tHandshaker.java:1185) ... еще 14
Я обнаружил, что могу заставить Java доверять сертификату, реализующему мой собственный HostNameVerifier, который я скопировал здесь: com.sun.jbi.internal.security.https.DefaultHostnameVerifier просто проверить (кстати, имя хоста, переданное в качестве аргумента в HostnameVerifier, правильно, поэтому я думаю, что это должно было быть принято).
Я использую поле сертификата CN как имя хоста (обычно IP-адрес).
Может кто-нибудь, пожалуйста, скажите мне, что я делаю что-то неправильно и указываю мне в правильном направлении?