一、引言
1.1 问题的引入

客户端A、B、C都想要下载服务器S的某个文件,但文件传输过程中会经过许多不可靠的节点,应该如何保证A、B、C的请求不被篡改,且保证A、B、C收到的是没有被篡改的文件呢?
1.2 第一次解决——加密

服务器S做了一对密钥,私钥自己保留,并把公钥发送给客户端A、客户端B、客户端C保存。

这样,客户端A可以用公钥对请求进行加密,密文为&A2*XVqzp346(??=;服务器S收到后用私钥解密,明文为“客户端A想要下载资源文件”;中间节点没有私钥,无法解密这个请求,也就无法篡改了。

此时,服务器S需要把资源文件传给客户端A,需要保证安全性,于是服务器S决定使用“数字签名(Digital Signature)”:将资源文件用Hash函数生成“摘要(Digest)”,然后用私钥对这个摘要加密,生成数字签名。中间节点一旦修改任意的数据,摘要就会发生变化,而新的摘要需要用私钥加密,中间节点无法生成新的摘要,也就无法篡改了。
例如服务器S生成摘要“MD5-1234567”,加密后为数字签名Xzpqp190&)DVsz;将资源文件和数字签名一起发给客户端,客户端收到后用资源文件生成摘要“MD5-1234567”,用公钥解密数字签名,得到服务器S发送的摘要“MD5-1234567”,如果两个摘要一样,则文件确实是服务器S发出的。
1.3 加密存在的问题

不可靠节点U通过某种方式去掉了服务器S的真公钥,并自己生成了一对假公钥,把假公钥发送给客户端A。当服务器S传递文件的时候,不可靠节点U解开资源文件,并加入木马病毒,重新用自己的私钥签名,发送给客户端A。客户端A用U的假公钥解开验证,一切正常,误以为是服务器S传递过来的真文件。
1.4 第二次解决——证书授权中心

服务器S去一个权威机构“证书授权中心(Certificate Authority)”,将服务器的信息、服务器S的公钥一起用CA私钥加密,生成“数字证书(Digital Certificate)”。

服务器S把通过认证的证书发给客户端,客户端用CA公钥解密和验证后得到服务器S公钥,保证服务器S公钥不会被篡改。
二、数字签名 Digital Signature
数字签名(Digital Signature),就是只有信息的发送者才能产生的别人无法伪造的一段数字串。常见的数字签名手段就是Hash算法,如MD5、SHA256,原理也很简单,将数据通过哈希函数映射到一段字符串上,一旦改动了数据,字符串也会变化,不产生变化的概率极低,也就是所谓的“不可抵赖性”。
MD5在我中学时期很火,各大下载站为了保证自己的下载内容没有被注入木马,通常都会在网站上挂着MD5校验值。现在木马已经很少了,而且SHA256更安全用得更多一些。
三、证书授权中心 CA
证书授权中心(Certificate Authority,CA),作为一个受信任的第三方,承担公钥合法性校验的责任。
3.1 证书链 Certificate Chain
CA如果直接颁发数字证书,一旦CA的私钥泄漏,所有的证书都将无效。

因此CA设立了三级证书,分别是根证书(Root Certificates)、中间证书(Intermediates Certificates)、终端用户证书(End-user Certificates)。
- 根证书的私钥通常存放在断网的环境里,隔离保护;根证书通常除了提供官方下载渠道下载,还会和其他厂商合作,比如Windows操作系统,Chrome浏览器,让其内置这张证书。
- 中间证书可能会有多级,比如二级中间证书、三级中间证书等。终端用户证书只能由这些二级CA、三级CA颁发,这样一旦某个中间CA的私钥泄漏,根CA重新颁发一张证书即可。中间CA的私钥一旦泄漏,也意味着各大浏览器都会标记这家CA颁发出的终端用户证书不安全,这家公司将会倒闭。
- 终端用户证书则是我们平时使用到的服务器证书。
剩下的问题就是这么多级证书如何做校验?

根证书-中间证书-终端用户证书形成了证书链(Certificate Chain),当校验的时候,根据颁发机构ID一级一级往上提取证书,然后一级一级根据公钥校验证书合法性。
我们可以看看比较出名的公司使用的什么证书(通过点击浏览器小绿锁就可以看到了):

百度用的Globalsign根CA。

中国建设银行用的DigiCert。

github用的DigiCert。

google用的GlobalSign。
3.2 自建CA问题
如果只是自己使用,当然可以自己搭建CA给自己签发证书,但浏览器一般都会提示“不安全”,因为这个证书不是权威机构颁发的。
四、证书类型
证书一共有三种类型:域名型证书DV(Domain Validation SSL Certificate)、企业组织型证书OV(Organization Validation SSL Certificate)、增强型证书EV(Extended Validation SSL Certificate)。
| 对比项 | DV | OV | EV |
|---|---|---|---|
| 审核内容 | 域名 | 域名、组织信息 | 域名、组织信息、第三方数据库 |
| 签发周期 | 几分钟~几小时 | 2~5天 | 5~7天 |
| 赔付保障 | 少 | 一般 | 多 |
| 浏览器表现 | 绿锁 | 绿锁 | 绿锁+组织信息 |
| 证书详情 | 显示域名 | 显示组织名 | 显示组织名 |
| 用途 | 个人站点 | 一般企业网站 | 金融等要求较高的企业网站 |
| 收费 | 千元级 | 万元级 | 万元级 |
例如,随便找的一个个人博客的DV证书:

百度的OV证书:
随便找的一个EV证书网站,会在浏览器显示公司信息:




粤公网安备44030602007943号