Ответ 1
Похоже, что сертификат SSL для домена .com был предоставлен sub.domain.com. Или, что более вероятно, домен domain.com был переименован в sub.domain.com без обновления сертификата SSL.
Я получаю ошибку "HTTPS hostname wrong:" при попытке подключения к серверу с помощью 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 для домена .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 hostname неправильный: должен быть именем хоста, как в сертификатах.