Я открываю безопасный сокет SSL для порта 12345 на моем сервере. Сейчас я использую самоподписанный сертификат. Я установил сертификат в хранилище ключей сервера и доверенного хранилища клиента; хорошо, бла-бла-шум.
Я строю на этом примере: http://www.exampledepot.com/egs/javax.net.ssl/Client.html
Клиент правильно проверяет наличие у сервера подписанного сертификата. Кажется, что клиент НЕ проверяет, что представленный сертификат CN (Common Name) соответствует имени хоста сервера, к которому я подключаюсь. Очевидно, что получить подписанный сертификат несложно, если не требуется, чтобы он соответствовал запрашиваемому домену.
Когда я устанавливаю свой сертификат (используя keytool --import), я устанавливаю его как сертификат корневого уровня? Нужно ли подписывать второй сертификат, используя первичный ключ первого сертификата? Почему TrustManager не проверяет общее имя?
Надеюсь, это имело смысл, и я не слишком обдумываю все это.
Спасибо!
ОБНОВЛЕНИЕ: Похоже, что для Java SSL может потребоваться проверка сертификатов вручную? (http://www.java2s.com/Open-Source/Java-Document/Net/Apache-common-HttpClient/org/apache/commons/httpclient/contrib/ssl/StrictSSLProtocolSocketFactory.java.htm) Может ли это действительно быть правдой? Я ожидал, что по умолчанию будет безопасным, а все, что меньше, потребует явного переопределения. Я удивлен. Может кто-то подтвердить?