数字指纹?
数字指纹或称为数字摘要,就是将服务端公钥通过数字摘要算法转变成的某个 hash 值 关于公钥和私钥
服务端有公钥和私钥,CA 机构也有公钥和私钥,数字证书中被 CA 私钥加密的是服务端的公钥,数字证书中还有未加密明文显示的服务端公钥,服务端公钥本来就是公布出去的,之所以加密服务端公钥是为了后序进行验证合法性。CA 机构的公钥在更早的时候已经植入在用户机器或者用户浏览器中
公钥和私钥是相对而言,公钥是公开的密钥,私钥是不公开的密钥,如果我知道公钥和知道被私钥加密后的数据,也是无法推出私钥是多少的,试想一下如果拿到了 CA 私钥,这将是一件很可怕的事情,因为它可以伪造证书,然后自己随意创建服务端的非对称秘钥,通过 CA 私钥对服务端公钥加密,这样也会被客户浏览器识别为合法的证书!
图片展示 https 的传输过程大致是如何的呢?我们来看非常具有总结性的图片描述
具体过程 在客户端浏览器 https 请求服务器之前的一些故事…
最开始故事是这样的,某龙头企业 mlcrosoft 向 CA 组织申请自己成为 CA 机构
最开始,某一龙头企业向 CA 组织申请自己可以成为受 CA 组织管控的 CA 机构来进行数字证书的分发工作(这样的好处是自己可以给自己签发大量的子证书),CA 组织经过复杂的审核后同意该 CA 机构合规
CA 机构强制系统和浏览器安装自己的证书
新成立后,CA 机构会强迫所有的系统和浏览器安装自己的 CA 机构根证书(根证书中含有 CA 机构的公钥,用于对向 CA 机构申请的数字证书进行解密操作),这些 CA 根证书一般通过系统更新安装在系统中(比如 IE 和 chrome),或者浏览器新版本更新植入浏览器内(比如 FireFox),根证书我们可以在 windows 中搜索“internet 选项”【内容】->【证书】->【受信任的根证书颁发机构】来查看,但是这里会有一个漏洞,需要大家注意:如果 CA 机构直接使用根证书的公钥私钥来对申请通过的数字证书解密加密,当这个 CA 机构被 CA 组织取消资格或者该 CA 机构一旦颁发错了根证书,那就意味着此 CA 机构签发的所有数字证书都会失效,这是一个很麻烦的事,解决思路就是 CA 机构一般不直接通过根证书来签发各个申请厂家的数字证书,而是通过一个中间证书来对各个申请厂家的数字证书进行签发,中间证书又是被根证书的密钥进行加密,中间证书的密钥又可以对各个厂家申请的数字证书进行加密操作,这样的三个角色形成了一个证书链,若 CA 机构的根证书被取消了,但是中间证书的存在使得各个厂家申请的数字证书依旧被识别为安全有效。中间证书实际上可以重复多次,也就是说存在中间证书到中间证书到中间证书再到各厂家申请的数字证书的形式。中间证书我们可以在 windows 中搜索“internet 选项”【内容】->【证书】->【中间证书颁发机构】来查看
之后有一大厂向 CA 机构申请数字证书
此刻,某一大厂的服务端生成了自己的公钥和私钥,它开始向 mlcrosoft (CA 机构)申请自己的数字证书
大厂拿自己的公共密钥登录到数字证书认证机构 CA 申请自己的数字证书
这个机构目前几乎全部被欧美掌控,CA 机构不止有一家,而是众多家,这些 CA 机构会分发数字证书,很多国外巨头企业自己也有 CA 机构,比如微软,它就可以做到自签,定期会有 CA 组织统一管理这么多被认可的 CA 机构,对他们签发给每位申请者的每一张数字证书进行审查工作
CA 机构使用自己的密钥对申请厂家服务端的公钥进行数字签名以及颁发数字证书操作,这样各申请厂家就可以拿到了属于自己的数字证书了
客户端浏览器开始 https 请求服务器的复杂故事…
客户端浏览器进行 https 访问请求
服务端收到 https 访问请求,会向客户浏览器发送自己的数字证书
发送回来的数字证书中包含了各种信息,包括被证书链中上层 CA 私钥加密后得到的数字签名,还包含服务的端的公钥,以及该证书的上层签发机构是谁
浏览器自己来验证数字证书的可信性
具体的操作过程是,浏览器拿到了服务端发送过来的数字证书之后,通过数字证书中指明的颁发者是谁,在系统或者浏览器的受信任证书中找到这个颁发者证书,并且用这个颁发者证书(上层证书)中暴露的公钥对数字证书中的数字签名进行解密操作,解密之后浏览器就可以拿到数字指纹或者称之为数字摘要,它是一个将服务端公钥通过数字摘要算法转化得到的 hash 值,浏览器如果要验证这个数字证书是合法的,实际就是验证这个数字指纹是匹配的,浏览器怎么验证指纹匹配呢?它会通过数字摘要算法把数字证书中的公钥转为新的数字指纹,然后浏览器拿这个新生成的数字指纹和利用上层 CA 公钥解密之后得到的数字指纹进行匹配,如果匹配的结果是一致的,那就直接说明该证书是没有问题的。
由于存在一整套证书链,服务端返回的数字证书是由存储在浏览器中或者系统中的上层证书所签发的,然后这个上层证书又是由再上一层证书签发的,最上一层就是根证书了,根证书是自己签发自己,用自己的暴露的公钥可以对自己的数字签名解锁,这种层层签发的证书形成了一个有效的证书链,当我们识别出服务端返回的证书是合法的时候,我们会依次向上访问上层证书(一一解密),直到 root 根证书为止,若浏览器最终访问到它信任的根证书的时候,那么浏览器将会把服务端返回的数字证书识别为可信的数字证书,有时候你会发现浏览器会对没有安装中间证书的网站做出不可信的提示,这实际就是完整证书链缺失的后果
当客户端 https 请求服务端时候,服务端会返回一个数字证书给客户浏览器,客户浏览器使用早已内置在浏览器中的 CA 公钥(其实是内置的根证书中有公钥)对数字证书中的数字签名进行解密操作得到数字指纹,然后浏览器再对数字证书中的公钥进行数字摘要算法转为数字指纹,浏览器将解密得到的数字指纹和刚新生成的数字指纹进行比对,如果一致就表示证书合规,所访问的网站是合法的