java.io.IOException: HTTPS 主机名错误:应该是 <域名>
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22534976/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.io.IOException: HTTPS hostname wrong: should be <domain name>
提问by TikTik
I am trying to hit the url using URLConnection using below code, getting the error as ,
我正在尝试使用以下代码使用 URLConnection 访问 url,得到的错误为,
java.io.IOException: HTTPS hostname wrong: should be <XXXX.XXXX.XXX>
at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at protocol.URL_Certificate.main(URL_Certificate.java:55)
public class URL_Certificate {
public static void main(String[] args) {
String urlPlugin = "https://XXXX.XXXX.XXX/signin";
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public void checkServerTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts,
new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext
.getSocketFactory();
InputStream input;
BufferedReader br;
String line = "";
// All set up, we can get a resource through https now:
final URLConnection urlCon1 = new URL(urlPlugin).openConnection();
// Tell the url connection object to use our socket factory which
// bypasses security checks
((HttpsURLConnection) urlCon1)
.setSSLSocketFactory(sslSocketFactory);
input = urlCon1.getInputStream();
br = new BufferedReader(new InputStreamReader(input));
line = "";
while ((line = br.readLine()) != null) {
// TODO: Need to Remove
System.out.println(line);
}
br.close();
input.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
}
I can able to get the response on hitting url in browser, but not able via code.... In above code i have skipped the certificate validation too..
我可以在浏览器中点击 url 获得响应,但无法通过代码获得响应......在上面的代码中,我也跳过了证书验证......
回答by Martin
Maybe the SSL ceriticate has been setup for a subdomain or the other way around?
也许 SSL 证书已为子域或其他方式设置?
Is it the right url you're write here:
您在这里写的网址是否正确:
String urlPlugin = "https://XXXX.XXXX.XXX/signin";
回答by Darin
You might also need to override the hostname verifier:
您可能还需要覆盖主机名验证器:
sslSocketFactory.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
There is bug in java 1.7 that can generate this error even when you have done everything right. The workaround is to disable the SNI extension with:
java 1.7 中存在一个错误,即使您已正确完成所有操作,也会产生此错误。解决方法是禁用 SNI 扩展:
"-Djsse.enableSNIExtension=false"