使用IP调用https的webservice问题

www.acgist.com/article/393.html
使用IP调用https的webservice问题2017年02月08日 错误信息:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present at sun.security.ssl.Alerts.getSSLException(Alerts.java: 192 ) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java: 1949 ) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java: 302 ) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java: 296 ) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java: 1509 ) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java: 216 ) at sun.security.ssl.Handshaker.processLoop(Handshaker.java: 979 ) at sun.security.ssl.Handshaker.process_record(Handshaker.java: 914 ) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java: 1062 ) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java: 1375 ) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1403 ) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1387 ) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java: 559 ) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java: 185 ) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java: 1283 ) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java: 1258 ) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java: 250 ) at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java: 104 ) ... 39 more Caused by: java.security.cert.CertificateException: No subject alternative names present at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java: 144 ) at sun.security.util.HostnameChecker.match(HostnameChecker.java: 93 ) at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java: 455 ) at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java: 436 ) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java: 200 ) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java: 124 ) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java: 1491 ) ... 52 more
http请求错误:
1 2 3 4 5 javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names matching IP address xxx.xxx.xxx.xxx found at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java: 174 ) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java: 1747 ) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java: 241 ) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java: 235 )
【使用IP调用https的webservice问题】后来发现不能使用IP调用https的webservice接口,解决办法:

1.使用域名访问

2.忽略SSL证书,代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 package com.sojson.www.zhanzhang.utils; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class SslUtils { private static void trustAllHttpsCertificates() throws Exception { TrustManager[] trustAllCerts = new TrustManager[ 1 ]; TrustManager tm = new miTM(); trustAllCerts[ 0 ] = tm; SSLContext sc = SSLContext.getInstance( "SSL" ); sc.init( null , trustAllCerts, null ); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } static class miTM implements TrustManager,X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return null ; } public boolean isServerTrusted(X509Certificate[] certs) { return true ; } public boolean isClientTrusted(X509Certificate[] certs) { return true ; } public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { return ; } public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { return ; } } /** * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用 * @throws Exception */ public static void ignoreSsl() throws Exception{ HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { return true ; } }; trustAllHttpsCertificates(); HttpsURLConnection.setDefaultHostnameVerifier(hv); } }
参考:http://www.sojson.com/blog/195.html

    推荐阅读