Неверное имя хоста HTTPS:должен быть <sub.domain.com>.Что является причиной этого?
Вопрос
Я получаю сообщение об ошибке «Неправильное имя хоста HTTPS:» при попытке подключения к серверу с использованием https.Мой URL выглядит примерно так
https://sub.domain.com/tamnode/webapps/app/servlet.
Я подключаюсь, используя следующий код
// Create a URLConnection object for a URL
URL url = new URL(requestedURL);
HttpURLConnection.setFollowRedirects(false);
// connect
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$
OutputStreamWriter wr = new OutputStreamWriter(connection
.getOutputStream());
но потом получаю ошибку
IOException: HTTPS hostname wrong: should be <sub.domain.com>.
at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing
....
Это код, который работал в прошлом, но больше не работает.В архитектуре системы произошли некоторые изменения, но мне нужно получить больше данных, прежде чем обращаться к ответственным лицам.
Что может вызвать эту ошибку?Могу ли я отключить проверку URLSpoofing?
Решение
Похоже, что SSL-сертификат для domain.com был передан sub.domain.com. Или, более вероятно, то, что было domain.com, было переименовано в sub.domain.com без обновления SSL-сертификата.
Другие советы
cletus прав в отношении вероятной причины.
Также есть способ отключить проверку на поддельный.
Вы можете создать объект, который реализует HostnameVerifier , который возвращает true при большем количестве обстоятельств, чем« обычно ».
Вы бы заменили HostnameVerifier по умолчанию, вызвав setHostnameVerifier для объекта подключения в коде в вопросе.
Этот ответ был «вдохновлен»: http://www.java -samples.com/showtutorial.php?tutorialid=211 р>
Я нашел эту ссылку по этому запросу: http: / /www.google.com/search?q=https+hostname+wrong+should+be р>
Еще одно замечание: подумайте дважды, прежде чем сделать это. Вы создадите уязвимость в безопасности между компонентами вашего клиента и сервера.
Я получил это исключение - java.io.IOException: HTTPS hostname wrong: should be <localhost>
.
Мое решение: я изменил свой самозаверяющий сертификат и сделал CN=localhost
.
ИЛИ
Добавьте доменное имя вашего сертификата cn=<domain-name>
в файл вашего хоста, вероятно, расположенный по адресу c:/windows/system32/drivers/etc/...
Следующий код решил мою проблему
static {
//for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier() {
@Override
public boolean verify(String hostname,
javax.net.ssl.SSLSession sslSession) {
if (hostname.equals("your_domain")) {
return true;
}
return false;
}
});
}
Используйте имя хоста (имя DNS) в качестве псевдонима.
Бывший:
keytool -import -alias <google.com> -file certificate_one.cer -keystore cacerts
Java по умолчанию проверяет, что сертификат CN (Common Name) совпадает с именем хоста в URL. Если CN в сертификате не совпадает с именем хоста , ваш клиент веб-службы завершится ошибкой со следующим исключением: java.io.IOException: HTTPS имя хоста неверно: должен быть именем хоста, как в сертификатах.