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