来源:证书有效性验证、根证书 - 程序员大本营
一、 数字证书的有效性验证主要从三个方面:
(1)数字证书有效期验证
(2)根证书验证
(3)CRL验证
1、数字证书有效期验证
就是说证书的使用时间要在起始时间和结束时间之内。通过解析证书很容易得到证书的有效期
2、根证书验证
先来理解一下什么是根证书?
普通的证书一般包括三部分:用户信息,用户公钥,以及CA签名
那么我们要验证这张证书就需要验证CA签名的真伪。那么就需要CA公钥。而CA公钥存在于另外一张证书(称这张证书是对普通证书签名的证书)中。因此我们又需要验证这另外一张证书的真伪。因此又需要验证另另外证书(称这张证书是对另外一张证书签名的证书)的真伪。依次往下回溯,就得到一条证书链。那么这张证书链从哪里结束呢?就是在根证书结束(即验证到根证书结束)。根证书是个很特别的证书,它是CA中心自己给自己签名的证书(即这张证书是用CA公钥对这张证书进行签名)。信任这张证书,就代表信任这张证书下的证书链。
所有用户在使用自己的证书之前必须先下载根证书。
所谓根证书验证就是:用根证书公钥来验证该证书的颁发者签名。所以首先必须要有根证书,并且根证书必须在受信任的证书 列表(即信任域)。
3、CRL验证
CRL是经过CA签名的证书作废列表,用于证书冻结和撤销。一般来说证书中有CRL地址,供HTTP或者LDAP方式访问,通过解析可得到CRL地址,然后下载CRL进行验证。
并且证书中有CRL生效日期以及下次更新的日期,因此CRL是自动更新的,因此会有延迟性。
于是呢,还有另外一种方式OSCP证书状态在线查询,可以即时的查询证书状态。
两种证书状态查询方式的比较:
二、https证书有效性验证引发的安全问题
如果用户手机中安装了一个恶意证书,那么就可以通过中间人攻击的方式进行窃听用户通信以及修改request(请求)或者response(答复,响应)中的数据。
手机银行中间人攻击过程:
1 、客户端在启动时,传输数据之前需要客户端与服务端之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。
2 、中间人在此过程中将客户端请求服务器的握手信息拦截后,模拟客户端请求给服务器(将自己支持的一套加密规则发送给服务器),服务器会从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3 、而此时中间人会拦截下服务端返回给客户端的证书信息,并替换成自己的证书信息。
4、 客户端得到中间人的response后,会选择以中间人的证书进行加密数据传输。
5 、中间人在得到客户端的请求数据后,以自己的证书进行解密。
6 、在经过窃听或者是修改请求数据后,再模拟客户端加密请求数据传给服务端。就此完成整个中间人攻击的过程。
以fiddler工具模拟中间人攻击为例:
1、 首先在手机中装入fiddler根证书:
导出fiddler的根证书;将fiddler根证书放入手机的SD卡中,然后在手机设置-安全中选择从SD卡中安装证书;成功安装fiddler根证书到手机上。
2 、在PC端打开fiddler,将手机通信代理到PC端fiddler所监听的端口上(可以在wifi中的高级设置中设置代理),这样手机银行的所有通信均会被fiddler监听到。
3 、启动手机银行客户端,会在fiddler中查看到所有请求的明文数据,并且可以进行修改后转发,成功将https加密绕过。
防护办法:
使用CA机构颁发证书的方式可行,但是如果与实际情况相结合来看的话,时间和成本太高,所以目前很少有用此办法来做。由于手机银行服务器其实是固定的,所以证书也是固定的,可以使用“证书或公钥锁定”的办法来防护证书有效性未作验证的问题。
具体实现:
1 公钥锁定
将证书公钥写入客户端apk中,https通信时检查服务端传输时证书公钥与apk中是否一致。
2 证书锁定:
即为客户端颁发公钥证书存放在手机客户端中,在https通信时,在客户端代码中固定去取证书信息,不是从服务端中获取。
三、根证书
1、定义
根证书是指CA机构颁发SSL证书的核心,是信任链的起始点。根证书是浏览器是否对SSL证书每个浏览器都有一个根证书库,有的浏览器是采用自主的根证书库,而一些浏览器则采取第三方的根证书库。而根证书库是下载客户端浏览器时预先加载根证书的合集。因此根证书是十分重要的,因为它可确保浏览器自动信任已使用私钥签名的SSL证书。受信任的根证书是属于证书颁发机构(CA),而CA机构是验证和颁发SSL证书的组织机构。
2、什么是证书链?
浏览器是如何鉴定信任网站的SSL证书?其实当客户端访问服务器时,浏览器会查看SSL证书并执行快速验证SSL证书的真实性。
浏览器鉴定SSL证书身份验证的操作是根据证书链的内容。那么证书链是什么?
用户在获取SSL证书之前,首先要生成证书签名请求(CSR)和私钥。在最简单的迭代中,用户将生成的CSR发生到证书颁发机构,然后使用CA机构的根证书的私钥签署用户的SSL证书,并将SSL证书发回给用户。
当浏览器检测到SSL证书时,就会查看证书是由其中一个受信任的根证书签名(使用root的私钥签名)。由于浏览器信任root,所以浏览器也信任根证书签名的任何证书。
而证书链是由两个环节组成—信任锚(CA 证书)环节和已签名证书环节。信任锚证书CA 环节可以对中间证书签名;中间证书的所有者可以用自己的私钥对另一个证书签名。这两者结合就构成了证书链。
3、什么是中间证书?
证书颁发机构(CA)不会直接从根目录颁发服务器证书(即SSL证书),因为这种行为是十分危险的,因为一旦发生错误颁发或者需要撤销root,则使用root签名的每个证书都会被撤销信任。
因此,为了避免这种风险发生,CA机构一般会引用中间根。CA机构使用其私钥对中间根进行签名,使浏览器信任中间根。然后CA机构使用中间根证书的私钥来签署用户申请的SSL证书。这种中间根的形式可以重复多次,即使用中间根签署另一个中间件,然后CA机构通过中间件签署SSL证书。
这是证书链的可视化过程,从上述例子可看出,CA机构只需要使用一个中间体来保持简单的操作,但其实真正的证书链通常要复杂的多。
4、数字签名有什么作用?
当根证书以数字方式签署中间证书时,就会将部分信任转移到中间证书。因为签名是直接来源于收信人的根证书的私钥,因此它会自动受信任。
当浏览器或其他客户端检测到服务端的SSL证书,就会收到证书本身或与证书相关联的公钥。然后通过公钥,解锁数字签名,查看是由哪家企业签署了证书。即当客户端浏览器访问网站时,会对服务器用户的SSL证书进行身份验证,通过公钥来解锁加密的签名,解锁的签名就会随着签署的证书,反馈到浏览器信任的根证书库中。
如果解锁的签名链接是不在浏览器信任的根证书库中,浏览器就会对该证书显示不安全。
5、根证书CA和中间根CA的区别?
根证书CA是拥有一个或者多个受信任根的证书颁发机构,即CA机构已扎根在主要浏览器的信任库中。而中间根CA或子CA是颁发中间根的证书颁发机构,他们不一定在浏览器的信任库中有根证书,而是将他们的中间根链接回收到受信任的第三方根,这种就被称为交叉签名。
所以有一些CA机构颁发的证书并不是直接从他们的根源发出的,而是通过中间根签署证书来加强安全层,这有助于减少发生错误或安全事件的机率。如果撤销中间根,而不是撤销根证书以及按扩展名签署的证书,这种做法会导致中间根签发的证书不受信任。
其实目前就有一件经典的案例,就是谷歌和其他主流的浏览器都取消对赛门铁克品牌的SSL证书。据悉,赛门铁克的SSL证书目前已颁发了数百万,取消对其的信任似乎是一件艰巨的项目。但在实际中,这是一项非常简单的工作,因为只需要在浏览器的根证书库中删除Symantec CA的所有根就可以。
6、链式根和单一根之间的区别?
单一根是由CA拥有的,可直接颁发证书,可以让部署证书的操作步骤变得更加简单。而链式根是Sub CA用于颁发证书的内容,是一个中间证书,但是因为中间根CA没有自己受信任的证书,必须链接到第三方受信任的CA。
区别具体如下:
链式根需要比较复杂的安装方法,因为中间根需要加载到托管证书的每个服务器和应用程序。链式根需要受到链接的CA支配,因为他们无法控制root用户,一旦root CA停业,他们也会收到巨大的牵连。根证书和中间证书过期的话,中间根必须要在根证书之前,这样就会增加工作难度。
最后,以上所提到的证书颁发机构、证书链和加密签名的信任根证书,其实本质上都是PKI或者公钥基础结构。
参考:数字证书有效性验证_鱼虾一整碗的博客-CSDN博客_数字证书有效性验证