现如今的Web,HTTPS早已经成为标配,公开的HTTP网站已经和Flash一样,慢慢在消亡了。

启用HTTPS的核心是证书。不知道大家是否有留意,前几年使用12306的时候,浏览器都会提示「您的链接不是私密链接」,这其实就是因为12306的证书有问题。如果点击「继续前往」,打开12306网站,它会提示你下载安装它提供的“根证书”。

浏览器网站的安全证书存在问题(浏览器是如何校验证书的)(1)

图片来源于网络

那么,证书是什么?里面含有什么内容?浏览器为什么会不信任12306的证书?为什么下载12306提供的根证书就可以解决这个问题?根证书又是什么?

证书:公钥和私钥

我们先来简单回顾一下TLS 和HTTPS。HTTPS全称是HTTP Over TLS,也就是使用TLS进行HTTP通信。

TLS (Transport Layer Security) 是一个安全通信协议,用于建立一个安全通道来交换数据。

看名字可以知道这是一个传输层协议,因此应用层协议对它是没有感知的,HTTP, FTP, SMTP都可以和TLS配合使用。

TLS创建安全链接的步骤如下:

我们先来看证书,证书是一个文件,里面含有目标网站的各种信息。例如网站的域名,证书的有效时间,签发机构等,其中最重要的是这两个:

关于RSA的公钥和私钥记住一点就行:我们可以使用算法生成一对钥匙,他们满足一个性质:公钥加密的私钥可以解开,私钥加密的公钥可以解开。

证书,顾名思义,是用来证明自己身份的。因为发送证书的时候是明文的(这一步也没法加密),所以证书内容是可以被中间设备篡改的。

那么要怎样设计一套机制保证当我们访问github.com的时候,收到的证书确实是github.com的证书,而不是某个中间设备随意发来的证书?

解决办法是采用「信任链」。

首先,有一批证书颁发机构(Certificate Authority,简称为CA),由他们生成秘钥对,其中私钥保存好,公钥以证书的格式安装在我们的操作系统中,这就是根证书。

我们的手机、电脑、电视机的操作系统中都预装了CA的根证书,他们是所有信任构建的基石。当然,我们也可以自己下载任意的根证书进行安装。

接下来,只要设计一个体系,能够证明A证书签发了B证书即可。这样对于收到的任何一个证书,顺藤摸瓜,只要最上面的根证书在系统中存在,即可证明该证书有效。

比如说,我们收到了服务器发过来的C证书,我们验证了C是由B签发的,然后又验证了B是由A签发的,而A在我们的系统中存在,那也就证明了C这个证书的有效性。

这其中,A是根证书,B是中间证书,C是叶证书(类似树中的叶节点)。中间证书可以有很多个,信任的链条可以任意长,只要最终能到根证书即可。

得益于RSA的非对称性质,验证A是否签发了B证书很简单:

A使用自己的私钥给B生成签名的过程也就是「签发证书」,当我们收到B证书时,首先使用A证书的公钥(公钥存储在证书中解开签名获得hash)计算B的hash,如果两个hash匹配,说明B确实是由 A 签发的。

重复上面的过程,直到根证书,就可以验证某个证书的有效性。

本文内容为原创,转载请注明出处!

,