Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JimОтветов: 2

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

  • По умолчанию следует соблюдать RFC. President James K. Polk 27.12.2010

javassl-certificatesockets

Ответы

Ответ 1 · рейтинг 12 · user207421

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

Ответ 2 · рейтинг 1 · Raghuram

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы