公司用的是这个框架 突然需要访问Https 嗯。。
先看看Https是什么吧
安全超文本传输 使用套接字层SSL 进行交换 HTTP+SSL
HTTP 端口80 https端口 443
Https的过程
链接service 443端口 服务器端有一套数字证书 证书其实就是公钥和私钥 (
公钥和私钥
向服务端请求 服务端给客户端发送 锁 (公钥)客户点拿这个锁给自己的数据锁起来 然后发送给服务端 服务端用自己私人的钥匙(私钥) 解锁 )
传输证书 (公钥) 客户端解析 验证证书是否有效 有效的话 会产生个随机值 然后对随机值进行加密 锁起来
传给服务端 然后服务端进行对称加密(就是用同一个密钥(私钥)进行加密和解密
(加密是将数据资料加密 即使得到了资料也获取不到 认证 是身份认证 判断身份信息)
如何解决呢
AsyncHttpClient client = new AsyncHttpClient();
然后我们发现有这个方法 client.setSSLSocketFactory();
public void setSSLSocketFactory(SSLSocketFactory sslSocketFactory) { this.httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sslSocketFactory, 443)); }
点进SSLSocketFactory看看 是什么
有一个ALLOW_ALL_HOSTNAME_VERIFIER 好像允许所有主机的方法
找到了他的构造方法
所以最后我们可以
X509HostnameVerifier hostnameVerifier = ALLOW_ALL_HOSTNAME_VERIFIER; //BROWSER_COMPATIBLE_HOSTNAME_VERIFIER SSLContext sc = null; try { sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[]{new TrustAllManager()},new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } cz.msebera.android.httpclient.conn.ssl.SSLSocketFactory s = new SSLSocketFactory(sc,hostnameVerifier ); client.setSSLSocketFactory(s);
private static class TrustAllManager implements X509TrustManager { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }