Проверка общего имени SSL-сертификата в Java

Я открываю безопасный сокет 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) Может ли это быть правдой? Я ожидал, что значение по умолчанию будет безопасным, а все, что меньше, потребует явного переопределения. Я удивлен. Кто-нибудь может подтвердить?


person Jim    schedule 23.12.2010    source источник
comment
По умолчанию следует соблюдать RFC.   -  person President James K. Polk    schedule 27.12.2010


Ответы (2)


Проверка имени хоста зависит от приложения. Он встроен в Java в случае HTTPS через классы HttpsURLConnection и HostnameVerifier. Если вы используете SSLSocket напрямую, это зависит от вас, обычно через HandshakeCompletedListener.

person user207421    schedule 23.12.2010

Возможно, у вас есть такой код? Это проигнорирует несоответствие имени хоста, о котором вы упомянули.

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
    public boolean verify(String string,SSLSession ssls) {
        return true;
    }
});

В противном случае, как говорится в одном из комментариев в этой ссылке, вы получит исключение HTTPS hostname wrong: should be...

person Raghuram    schedule 23.12.2010