SSL-сертификат без имени хоста - PullRequest
5 голосов
/ 09 марта 2010

Я реализовал веб-сервис с аутентификацией сервера и клиента, используя keytool. Проблема в том, что эта аутентификация не работает, если я не включаю в нее имя хоста. Например:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

Но мне не нужно, и мне не нравится проверка по хосту или по IP. Есть ли способ избежать этого?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 09 марта 2010

SSL, как часть его требований, подтверждает, что сертификат CN соответствует имени хоста, к которому вы подключаетесь. Если CN не совпадает, то браузер предположит, что вы подключаетесь к неправильному хосту и объекту.

Обойти это невозможно.

3 голосов
/ 09 ноября 2012

Я согласен с другими авторами: если вы используете SSL, вы почти наверняка хотите подтверждение имени хоста как часть набора функций безопасности SSL.

Тем не менее, в зависимости от клиента, которого вы используете, вполне может быть способ обойти эту проблему. Инженеры обойдут проверку имени хоста в тестовых средах, для отладки, создания прототипов и т. Д. Если вы используете клиент Java, который подключается через HttpsURLConnection, это будет так же просто, как добавить следующее в ваш класс клиента:

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}
2 голосов
/ 09 марта 2010

Смысл использования SSL / TLS в том, чтобы клиент мог быть уверен, что он подключается к нужному сервису, а не к какой-то фиктивной службе, которая пытается выдать себя за реальную. Если (гипотетически) сертификат сервера не должен содержать никакой информации, идентифицирующей хост, то клиент, если сервер, с которым он вел переговоры, был правильным.

На самом деле, вам нужна проверка по DNS-адресу, потому что если вы этого не сделаете, ваша проверка SSL бесполезна. (Или, по крайней мере, нигде не так безопасно, как могло бы быть.)

Полагаю, теоретически вы могли бы попытаться установить связь между клиентом и сервером по каналам, защищенным другими средствами, кроме SSL / TLS. Но вам понадобится серьезный опыт в технологии безопасности и шифрования Java.

1 голос
/ 09 марта 2010

Стандартная логика: если вам не нужно защищать свои данные, не используйте SSL. Если вам нужно защитить его, то вам нужно знать, к какому хосту вы подключаетесь. Между ними быть не должно.

Однако в некоторых внутренних средах у вас может быть достаточно контроля над сетью и конфигурацией, чтобы не волноваться.

Если вы находитесь в последнем случае, то решение зависит от клиентских библиотек, которые вы используете. Если вы используете HTTP-клиент, прочитайте руководство по настройке SSL . Возможно, вам не нужно реализовывать свой собственный SecureProtocolSocketFactory, и вы можете просто использовать EasySSLProtocolSocketFactory .

...