Вопрос

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

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

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

Спасибо.

Это было полезно?

Решение

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

Там нет способа обойти это.

Другие советы

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

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

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

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

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

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

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

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

Если вы находитесь в последнем случае, то решение зависит от клиентских библиотек, которые вы используете. Если вы используете HTTP -клиент, то прочитайте Руководство по конфигурации SSL. Анкет Может быть, вам не нужно реализовать свой собственный SecureProtocolSocketFactory и может просто использовать EasySslProtocolSocketFactory.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top