Volley 开启对Https的支持,并且忽略对Hostname的检查

直接上代码:

mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext(),
new HurlStack(null, newSslSocketFactory()));

详见这篇文章,这里不在重复.

但仍有报错,

java.io.IOException: Hostname ... was not verified

证书的Hostname与实际的不匹配,历史原因不能修改证书。

别外的解决方法是让Https忽略对Hostname的Verify。但对Volley来说尝试了多种方法都不行。

之前一直使用的是apache的SSLSocketFactory,org.apache.http.conn.ssl.SSLSocketFactory

可以调用 setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER)来进行设置。

但Vollley中HurlStack使用的是 javax.net.ssl.SSLSocketFactory,没有找到可以进行设置的地方。

无耐之下,只能修改Volley的原代码,基于官方6.11日版本:

修改com.android.volley.toolbox.HurlStack的openConnection()

编译并导入测试可以正常通信,如相关资料所说,此法仅用于测试,正式使用还是很危险的。

// use caller-provided custom SslSocketFactory, if any, for HTTPS
if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) {
    ((HttpsURLConnection)connection).setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    });
    ((HttpsURLConnection)connection).setSSLSocketFactory(mSslSocketFactory);
}

Leave a Reply

Your email address will not be published. Required fields are marked *