数字证书及 CA - 扫盲小记

什么是数字证书？

数字证书是一种数字文档，证明用于加密在线资产（即电子邮件通信、文档、网站或软件应用程序）的公钥的真实性。

一个数字证书通常包含了：

公钥；

持有者信息；

证书认证机构（CA）的信息；

CA 对这份文件的数字签名及使用的算法；

证书有效期；

还有一些其他额外信息；

数字证书的作用

数字证书的作用，是用来认证公钥持有者的身份，以防止第三方进行冒充。说简单些，证书就是用来告诉客户端，该服务端是否是合法的，因为只有证书合法，才代表服务端身份是可信的。

什么是 CA?

CA 是 “Certificate Authority” 的缩写，也叫 “证书授权中心”。它是负责管理和签发证书的第三方机构，就好比例子里面的中介 ——C 公司。一般来说，CA 必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比 A、B 两公司都必须信任 C 公司，才会找 C 公司作为公章的中介。

什么是 CA 证书？

CA 证书，顾名思义，就是 CA 颁发的证书。

人人都可以找工具制作证书。但是你一个小破孩制作出来的证书是没啥用处的。因为你【不是】权威的 CA 机关，你自己搞的证书不具有权威性。

什么是证书的信任链？

实际上，证书之间的信任关系，是可以嵌套的。比如，C 信任 A1，A1 信任 A2，A2 信任 A3...... 这个叫做证书的信任链。只要你信任链上的头一个证书，那后续的证书，都是可以信任滴。

什么是根证书？

假设 C 证书信任 A 和 B；然后 A 信任 A1 和 A2；B 信任 B1 和 B2。则它们之间，构成如下的一个树形关系（一个倒立的树）

处于最顶上的树根位置的那个证书，就是 “根证书”。除了根证书，其它证书都要依靠上一级的证书，来证明自己。根证书是不需要被证明的，根证书是整个证书体系安全的根本。
所以，如果某个证书体系中，根证书出了问题（不再可信了），那么所有被根证书所信任的其它证书，也就不再可信了。这个后果是相当相当滴严重

CA 证书的作用？

验证网站是否可信（针对 HTTPS）

验证某文件是否可信（是否被篡改）

这里就要提到 HTTPS 了， 我们都知道 HTTP 跟 HTPPS 的区别：

HTTP 是明文传输的，存在安全风险，HTTPS 在 HTTP 与 TCP 之间加入了 SSL/TLS 安全协议 ，使得报文能够安全传输

HTTP 三次握手之后便可以进行传输，而 HTTPS 在 TCP 三次握手之后还需要 SSL/TLS 的握手才能传输

HTTP 默认端口是 80 而 HTTPS 默认端口是 443

HTTPS 需要向 CA 申请数字证书 来保证服务器的身份可靠

HTTPS 是加密协议，可以保证你的传输过程中，不被偷窥。
但是 HTTPS 就一定是安全的吗？ 假设有假的基站起了转发全部信息的作用，这样就获取了全部的信息啊？

为了防止坏人这么干，HTTPS 协议除了有加密的机制，还有一套证书的机制。通过证书来确保，某个站点确实就是某个站点。
有了证书之后，当你的浏览器在访问某个 HTTPS 网站时，会验证该站点上的 CA 证书（类似于验证介绍信的公章）。如果浏览器发现该证书没有问题（证书被某个根证书信任、证书上绑定的域名和该网站的域名一致、证书没有过期），那么页面就直接打开；否则的话，浏览器会给出一个警告，告诉你该网站的证书存在某某问题，是否继续访问该站点？

证书的签发和验证流程

CA 签发证书的过程，如上图左边部分：

首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包，然后对这些信息进行 Hash 计算，得到一个 Hash 值；

然后 CA 会使用自己的私钥将该 Hash 值加密，生成 Certificate Signature，也就是 CA 对证书做了签名；

最后将 Certificate Signature 添加在文件证书上，形成数字证书；

客户端校验服务端的数字证书的过程，如上图右边部分：

首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1；

通常浏览器和操作系统中集成了 CA 的公钥信息，浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容，得到一个 Hash 值 H2 ；

最后比较 H1 和 H2，如果值相同，则为可信赖的证书，否则则认为证书不可信