使用HttpsURLConnection进行https访问的时候,当验证服务器证书的时候,有时候会报下面的错误。

12-24 16:37:04.801: W/System.err(26380): java.io.IOException: Hostname '74.208.145.100' was not verified

12-24 16:37:04.801: W/System.err(26380): at com.android.okhttp.Connection.upgradeToTls(Connection.java:201)

12-24 16:37:04.801: W/System.err(26380): at com.android.okhttp.Connection.connect(Connection.java:151)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)

12-24 16:37:04.802: W/System.err(26380): at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)

12-24 16:37:04.802: W/System.err(26380): at com.example.ssl.MainActivity$1.doInBackground(MainActivity.java:75)

12-24 16:37:04.802: W/System.err(26380): at com.example.ssl.MainActivity$1.doInBackground(MainActivity.java:1)

然后查看服务器证书,发现其中的域名

CN=www.onlinehome-server.com

而我们的真正请求的域名

74.208.145.100

错误原因是验证证书时发现真正请求和服务器的证书域名不一致。

解决这个问题有两个方法:

1.重新生成服务器的证书,用真实的域名信息。

2.在客户端代码中增加如下代码,忽略hostname 的验证。(仅仅用于测试阶段,不建议用于发布后的产品中。)

HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){

public boolean verify(String string,SSLSession ssls) {

return true;

}

});

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐