补全证书链
需要补全证书链,很大原因也是签发机构签发证书时,是单独提供了用户证书,导致用户也只部署了用户证书,若未做兼容性测试,只在电脑上验证,是很难发现证书部署有问题的。
在第二部分我们讲到了证书的组成,由于常见的根证书已经内置了,所以不需要额外操作,我们要做的就是将中间证书添加到用户证书中,同样的根据完整证书结构:
-----BEGIN CERTIFICATE----- 用户证书 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 中间证书 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 根证书 -----END CERTIFICATE----- |
我们在证书机构下载到中间证书后,将其补到用户证书尾巴即可。
当然了,由于中间证书是公开的,所以我们也可以利用现成的工具去补全:
工具一、SSL certificate chain resolver | certificatechain.io
当我们把SSL证书申请下来时通常会有三个文件,包括证书的私钥文件 、证书的公钥文件和一个证书链文件,貌似我们把私钥文件和公钥文件部署到服务器上就可以了,浏览器也正常识别SSL证书,那证书链文件还有什么用,可以不用吗,本文就解释一下证书链文件以及它起到的作用。
一般我们下载的证书有私钥文件、公钥文件和一个证书链文件,如下图
云服务器申请的证书public文件就是公钥打开也就是我们的网站证书,chain文件就是证书链文件,key文件是私钥,第一个文件是公钥和证书链文件合成的文件。下面是从let's encrypt申请的证书,里面的key文件是私钥,certificate文件是我的网站的证书其内容就是公钥,ca_bundle就是证书链文件打开可以看到CA中间证书。
证书的结构如上图所示,一般是由CA根证书机构--CA中间证书机构--我们的网站证书构成,中间证书还可能存在多层关系。
系统或浏览器中预置了一些受信任的根证书颁发机构和某些中间证书颁发机构,ssl证书在被验证时最终要验证其根证书是否可信,网站证书的根证书在浏览器可信任根证书列表里才会被信任或者中间证书颁发机构可信其证书也是可信的,否则浏览器则会报告网站的证书来自未知授权中心。可是证书一般是由三级或多级结构构成,浏览器是不能通过用户证书直接验证其根证书的,这时中间证书即证书链文件起了作用,证书链文件告诉了浏览器用户证书的上级证书机构即中间证书,浏览器再通过中间证书验证其上级根证书是否为可信。
在用户证书里面我们会找到这样的信息,Authority Info Access(权威信息访问),通过这里面的 URL ,我们可以获得这个证书的颁发者证书,即中间证书。就是说我们在部署SSL证书时没有把证书链文件(中间证书)部署进去,浏览器依然可以通过证书上面的url信息访问到中间证书,继而验证根证书。
大部分浏览器都可以通过Authority Info Access(权威信息访问)的url链接获得中级证书,但是在安卓手机上就出现问题。安卓手机浏览器貌似并不支持这种方式获得中间证书,这就造成了即使我们的证书是权威机构签发的并且电脑访问没有问题,安卓手机浏览器就提示证书并不受信任,这时把证书链文件和公钥文件合并为一个文件部署到服务器上,浏览器在与服务器连接时就会把用户证书和中间证书都下载下来,这样安卓手机也不会在提示证书错误了。
证书链不完整导致的信任问题
比如某个网站布置好let's encrypt证书,电脑端浏览器都能信任证书,但是安卓手机浏览器出现问题如下图所示,安卓的浏览器都不信任网站证书,原因就是证书链不完整,缺少中间证书。
QQ浏览器:
UC浏览器:
MIUI浏览器:
谷歌浏览器: