之前,我讲了如何让tomcat支持https访问,当时浏览器通过https:localhost:8443即可访问tomcat。可是android此时如何访问已经搭建好的tomcat的https了?我在网上找了很多资料,发现还是有问题,后来自己改了一些,终于是做出来了。
1.搭建tomcat的https服务器。
这个,我之前的博客已经讲过,所有不在细讲了。
2.将搭建tomcat服务器时生成的server.cer证书放在android的assets目录下,应为客户端用https访问时需要检测服务器的证书是否符合要求。
3.编写一个类继承X509TrustManager,X509TrustManager是证书信任管理器类,我们可以自己实现该接口,让它信任我们指定的证书。
自己实现了信任管理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任管理器。其实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。
public class TrustAllCertsManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // Do nothing -> accept any certificates } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // Do nothing -> accept any certificates } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }
4.编写一个类实现HostnameVerifier接口,此类是用于主机名验证的基接口。
在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
策略可以是基于证书的或依赖于其他验证方案。
当验证 URL 主机名使用的默认规则失败时使用这些回调。
public class VerifyEverythingHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } }
此时,我设置对所有主机都可以访问。
5.实例化服务器的证书。
private TrustManager[] createTrustManager() { BufferedInputStream cerInputStream = null; try { // 获取客户端存放的服务器公钥证书 cerInputStream = new BufferedInputStream(getAssets().open("server.cer")); //