Я открываю безопасный сокет SSL для порта 12345 на своем сервере. Я пока использую самозаверяющий сертификат. Я установил сертификат в хранилище ключей моего сервера и хранилище доверенных сертификатов клиента; хорошо, бла-бла-шум.
Я строю этот пример: http://www.exampledepot.com/egs/javax.net.ssl/Client.html
Клиент правильно проверяет наличие у сервера подписанного сертификата. Похоже, что клиент НЕ проверяет, что представленный сертификат CN (общее имя) соответствует имени хоста сервера, к которому я подключаюсь. Очевидно, что получить подписанный сертификат несложно, если нет требования, чтобы он соответствовал запрошенному домену.
Когда я устанавливаю свой сертификат (используя 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) Может ли это быть правдой? Я ожидал, что значение по умолчанию будет безопасным, а все, что меньше, потребует явного переопределения. Я удивлен. Кто-нибудь может подтвердить?