本文分享CFCA SSL证书的小坑,简介CFCA SSL后将以一个小例子介绍httpclient使用过程中的证书问题,最后介绍证书问题的处理方式。 CFCA SSL简介CFCA 指中国金融认证中心,也是国家级的权威安全认证机构,服务于国内银行、保险、证券等金融企业。官方资料显示:
这确实很厉害,回想早几年12306使用自签名证书,用户访问时需要确认,目前12306也切换到 digicert 颁发的证书。 再来看看CFCA的,其根证书已存在于操作系统信任库中(有的浏览器使用自有证书库,如Firefox;有的直接使用OS的信任库,但存在白名单)。 目前CFCA的SSL证书在百度云有售,阿里云、腾讯云、华为云卖的主要还是Symantec、GeoTrust、Globalsign等国际权威公司的。 看着一切都挺好的,还能踩什么坑呢? 踩坑记因合作关系,CFCA 送了张2年的SSL证书,按百度售价也是价值3W,正好产品SSL证书快到期,于是在测试环境尝试使用。 使用时先是我本机浏览器显示不安全,接着有第三方集成公司反馈测试系统SSL通讯出现证书问题。看了CFCA资料后才发现: CFCA 根证书 2016.10.25 随着苹果IOS 10.1、Mac OS 10.12.1发布才嵌入苹果根证书库,在此之前,其根证书已加入微软、Mozilla、安卓的根证书库。 自然,我15年的老电脑且系统未升级的人就中招了。 了解第三方集成公司后,他们使用的Java技术栈,那估计是CFCA根证书不在JDK默认的信任库中导致的。 下面分析下问题的原理及处理方式。 Httpclient SSL 通讯演示阮一峰老师的 图解SSL/TLS协议 一文详细介绍了SSL通讯,这里用一段简短代码配合日志介绍Java中使用httpclient处理SSL通讯的几个步骤。
添加JVM参数
证书链日志比较多,就直接在浏览器上看证书链。第一个是根证书颁发机构,第二个是中级证书颁发机构,第三个是颁发给百度的证书。Server端返回证书链的作用是证明 “我是百度”,因为ROOT CA下就一个百度,证书作不了假。
CFCA 根证书问题可是JDK工具查看信任库的所有证书,确实没有CFCA的,检查了各JDK版本,JDK12也没有CFCA的根证书。
下面以访问CFCA官网为例来复现问题。
执行代码后会看到熟悉的找不到证书的错误,这是因为在信任库中找不到Server端返回的证书链中的任何证书,无法判断服务端到底是谁,因此拒绝连接,关闭了socket。 下面是Server返回的证书链中的三个证书subject信息,由于CFCA根证书不在JDK信任库中,我们自己也可以伪造一模一样的证书出来,如果能劫持DNS,那Client就被钓鱼了,连接了个假服务端,然后把数据都发过去了。
如何处理证书问题那针对这种证书怎么处理比较好呢?按照优劣程度,我排了序:
综上,购买证书时要考虑自身使用及第三方集成伙伴的情况,尽量选择根证书内置在各OS、浏览器及各程序语言单独信任库的机构颁发的证书。 |
|