在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。

  接口X509TrustManager有下述三个公有的方法需要我们实现:

  ⑴ oid checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException

  该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。

  ⑵ oid checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException

  该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

  ⑶ X509Certificate[] getAcceptedIssuers()

  返回受信任的X509证书数组。

  自己实现了信任管理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任管理器。其实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。HttpsURLConnection提供了方法setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。下面用一个图简单表示这几个JSSE类的关系:

图1 部分JSSE类的关系图
  假设自己实现的X509TrustManager类的类名为:MyX509TrustManager,下面的代码片断说明了如何使用MyX509TrustManager:

//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager ()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());

//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();

//创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
HttpsURLConnection httpsConn = (HttpsURLConnection)myURL.openConnection();
httpsConn.setSSLSocketFactory(ssf);

  这样,HttpsURLConnection对象就可以正常连接HTTPS了,无论其证书是否经权威机构的验证,只要实现了接口X509TrustManager的类MyX509TrustManager信任该证书。

  小结

  本文主要介绍了在HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法,一种方法是把该证书导入到Java的TrustStore文件中,另一种是自己实现并覆盖JSSE缺省的证书信任管理器类。两种方法各有优缺点,第一种方法不会影响JSSE的安全性,但需要手工导入证书;第二种方法虽然不用手工导入证书,但需要小心使用,否则会带来一些安全隐患。

最新文章

  1. AngularJS 表格
  2. WPF入门教程系列十一——依赖属性(一)
  3. Double 数据保留两位小数一:五舍六入
  4. Android系统中的6种模式
  5. poj2752 Seek the Name, Seek the Fame
  6. 配置阿里云作为yum 源
  7. 苹果新的编程语言 Swift 语言进阶(十二)--选项链
  8. ACE_Event_Handler:事件响应入口
  9. IT 人士如何避免中年危机?
  10. csrf
  11. IDEA配置注释模板
  12. xfs 的一些工具使用
  13. mysql字符集小结
  14. Oracle列转行函数版本不兼容解决方案
  15. 网络基础 记一次HTTPS证书验证测试过程
  16. 【算法】串的模式匹配算法(KMP)
  17. Socket 连接建立过程
  18. 虚拟机下Linux系统如何设置IP地址
  19. 实用ExtJS教程100例-001:开天辟地的Hello World
  20. Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证

热门文章

  1. postgresql plv8 安装
  2. ES6新增的数组方法
  3. 洛谷p1559运动员最佳匹配问题
  4. mysql 包含查找
  5. springboot修改页面不用重启的设置(idea)
  6. 缓存穿透 & 缓存击穿 & 缓存雪崩
  7. asp.net core api 跨域配置
  8. spring boot2X集成spring cloud config
  9. Maven 教程(6)— Maven之pom.xml文件简单说明
  10. javascript中的each遍历