CFCA SSL 证书踩坑记

栏目: 编程工具 · 发布时间: 5年前

内容简介:本文分享CFCA SSL证书的小坑,简介CFCA SSL后将以一个小例子介绍httpclient使用过程中的证书问题,最后介绍证书问题的处理方式。

封面图片来源: https://www.nytimes.com/guides/well/how-to-start-running

本文分享CFCA SSL证书的小坑,简介CFCA SSL后将以一个小例子介绍httpclient使用过程中的证书问题,最后介绍证书问题的处理方式。

CFCA SSL简介

CFCA 指中国金融认证中心,也是国家级的权威安全认证机构,服务于国内银行、保险、证券等金融企业。 官方资料 显示:

  • CFCA 是国际CA浏览器联盟组织成员,是国际证书标准的参与者

  • 根证书已存在于微软系统、Mozilla相关产品、安卓系统以及苹果相关产品中。

这确实很厉害,回想早几年12306使用自签名证书,用户访问时需要确认,目前12306也切换到 digicert 颁发的证书。

CFCA SSL 证书踩坑记

再来看看CFCA的,其根证书已存在于操作系统信任库中(有的浏览器使用自有证书库,如Firefox;有的直接使用OS的信任库,但存在白名单)。

CFCA SSL 证书踩坑记

目前CFCA的SSL证书在百度云有售,阿里云、腾讯云、华为云卖的主要还是Symantec、GeoTrust、Globalsign等国际权威公司的。

CFCA SSL 证书踩坑记

看着一切都挺好的,还能踩什么坑呢?

踩坑记

因合作关系,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通讯的几个步骤。


 

// 使用 org.apache.httpcomponents:httpclient:4.5.7

HttpClients.createDefault()

.execute(new HttpGet("https://www.baidu.com/"));

添加JVM参数 -Djavax.net.debug=all ,运行上述代码,可以看到整个SSL通讯的日志。

  • 启动时,程序使用的trustStore 是 $JAVA_HOME/jre/lib/security/cacerts ,国际权威公司的根证书都内置在JDK及操作系统信任库中。

不清楚 Keystore 和 Truststore 可参考 Difference Between a Java Keystore and a Truststore

CFCA SSL 证书踩坑记

  • SSL通讯时,首先Client向Server打招呼,将自己的SSL/TLS版本(TLSv1.2)、支持的加密算法(Cipher)等信息发送过去

CFCA SSL 证书踩坑记

  • 接着,Server返回选择的加密算法以及自己的证书链。

有时Client使用TLSv1.1及以下版本,出于安全起见,Server端一般使用TLSv1.2及以上,会出现问题

CFCA SSL 证书踩坑记

证书链日志比较多,就直接在浏览器上看证书链。第一个是根证书颁发机构,第二个是中级证书颁发机构,第三个是颁发给百度的证书。Server端返回证书链的作用是证明 "我是百度",因为ROOT CA下就一个百度,证书作不了假。

CFCA SSL 证书踩坑记

  • Client拿到Server的证书链后,会在TrustStore中查找证书。对于百度,找到了 GlobalSign Root CA 这个根证书,因此可以确认Server端确实是百度,不是其他钓鱼网站。

CFCA SSL 证书踩坑记

CFCA 根证书问题

可用JDK工具keytool查看信任库的所有证书,检查了各JDK版本,JDK12也没有CFCA的根证书。

keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

下面以访问CFCA官网为例来复现问题。


 

HttpClients.createDefault()

.execute(new HttpGet("https://www.cfca.com.cn/"));

执行代码后会看到熟悉的找不到证书的错误,这是因为在信任库中找不到Server端返回的证书链中的任何证书,无法判断服务端到底是谁,因此拒绝连接,关闭了socket。

CFCA SSL 证书踩坑记

下面是Server返回的证书链中的三个证书subject信息,由于CFCA根证书不在JDK信任库中,我们自己也可以伪造一模一样的证书出来,如果能劫持DNS,那Client就被钓鱼了,连接了个假服务端,然后把数据都发过去了。


 

Subject: CN=www.cfca.com.cn, OU=运行部, O=中金金融认证中心有限公司

Subject: CN=CFCA EV OCA, O=China Financial Certification Authority, C=CN

Subject: CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN

如何处理证书问题

那针对这种证书怎么处理比较好呢?按照优劣程度,我排了序:

  • 最佳方式 :不使用CFCA的SSL证书,推荐使用国际顶级CA公司颁发的证书,他们的根证书都内置在各种OS、浏览器及JDK的证书库中。

  • 次优选择 :如果由于其他因素非得使用一般的证书,则直接导入根证书。例如将CFCA的根证书导入JDK,但这需要合作伙伴做导入操作,如果合作伙伴比较多将非常麻烦。导入根证书的好处: 根证书有效期长达二十甚至三十年,购买的证书往往只有几年,后续证书升级后不用重复导入证书到信任库

  • 较差选择 :导入自己购买的证书,到期升级后需要通知第三方合作伙伴升级信任库中证书,十分麻烦。

  • 最差选择 :作为调用方,可以选择忽略证书验证,这样即使服务端证书不在自己的信任库中,也可以进行SSL通讯,便利的同时,也会带来巨大的安全风险,需要衡量。

综上,购买证书时要考虑自身使用及第三方集成伙伴的情况,尽量选择根证书内置在各OS、浏览器及各程序语言单独信任库的机构颁发的证书。


以上所述就是小编给大家介绍的《CFCA SSL 证书踩坑记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试