浏览器是如何验证HTTPS证书合法性的?

一个新的网站去买了ca证书,用户通过浏览器去访问,这时候浏览器如何去验证这个证书的正确性,防止被中间人攻击? 是需要到ca网站上去验证吗还是什么?

下文通过介绍https证书的结构组成和浏览器如何验证证书的合法性,来解答这个问题。

证书颁发机构,也就是CA,是不会直接向用户签发证书的,而是多了一层中间证书颁发机构。CA会自己给自己签发一个证书,这个证书叫做根证书或Root CA;然后CA会通过根证书来签发中间证书,授权中间证书颁发机构签发证书的权限;最后中间证书颁发机构通过中间证书向用户签发用户证书。至于为什么需要多这么一层中间证书颁发机构,目的是为了保护根证书,减少根证书被攻击或者说被**的风险。因为一旦根证书被**了,根证书所属的CA颁发的所有证书都将失去保护网站的能力,这是一件十分严重的事情。

值得注意的是,中间证书可以不止一个,中间证书层数越多,根证书越安全,但是中间证书越多,证书结构越复杂,越占用通信资源。所以一般情况下,用户收到的证书是三个证书(一个根证书、一个中间证书、一个用户证书)或四个证书(一个根证书、两个中间证书、一个用户证书)。

下面以一个部署了证书的网站为例,如图所示,点开浏览器地址栏的绿色安全锁。

浏览器是如何验证HTTPS证书合法性的?

再点开证书信息,在证书路径界面显示的这三个证书就是要找的完整证书。从上到下分别是:根证书、中间证书和用户证书。

浏览器是如何验证HTTPS证书合法性的?

事实上,申请到的证书只是用户证书,中间证书和根证书是很早就被签发,很早就存在的。我们还要再了解一下根证书库这个概念,浏览器为什么信任CA签发的证书呢?

因为CA是可信任的第三方组织,负责证书的生成、签发和作废。为什么CA时可信的呢,因为他们被WebTrust信任。只有通过WebTrust国际安全审计认证的证书颁发机构CA,其签发的证书才会被各大浏览器信任。根证书库包含浏览器信任的证书颁发机构CA的根证书,有的浏览器会自建根证书库,比如Mozilla Firefox,有的浏览器会使用其他浏览器的根证书库。

那么问题来了,谁来验证证书的合法性呢?当然是浏览器啦,那么浏览器是如何验证的呢?

用户证书被中间证书信任,而中间证书被根证书信任,根证书又被浏览器信任,这样一个完整的证书链使得浏览器可以在根证书库内一次检索用户证书、中间证书和根证书,如果能匹配到根证书,那么这一信任链上的所有证书都是合法的。

浏览器是如何验证HTTPS证书合法性的?

这里有个题外话,中间证书和根证书统称为证书链,如果我们在部署证书时,仅导入了用户证书,那么PC端访问网站是没有问题的,因为PC浏览器内置绝大部分CA的证书链,会自动补全。如果是移动端访问,如大部分的手机浏览器,那么就会提示不安全,因为大部分的手机浏览器并不会内置证书链,所以无法识别用户证书,也就会把网站标记为不安全。所以切记,部署证书是一定要安装证书链。

这时候又出现了一个新的问题,如果用户证书被吊销,浏览器还会显示安全吗?证书颁发机构有个叫做证书作废列表的东西。证书签发以后,如果出现私钥泄露或丢失、证书所有者信息变更、不再需要继续使用证书等情况,证书颁发机构将会对证书进行作废,并将证书的***登记在证书作废列表CRL中。浏览器通过查询证书颁发机构CA最新的CRL,可以确定某个证书是否有效。但是,浏览器并不可能在每个访问者访问每个网站时都向CA查询一次,那这工作量也太大了,所以通常浏览器会定期查询CA最新的CRL,这也就会在一定程度上出现,证书被吊销了,浏览器依旧会信任的情况,但是这个是时间不会太久。

如果用户证书没有问题,反而证书颁发机构CA由于安全防护出现问题导致一些机密内容泄露,那么这个CA就不应该被信任,各大浏览器就会将这个CA的根证书从根证书库中删除。这样,该证书签发的所有中间证书和用户证书都将不被信任。