证书颁发机构(CA, Certificate Authority)是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
如何向 CA 申请证书
(当然不是所有的申请流程都如下所述,但原理都是一样的)
我们需要使用一个 openssl 软件,在这个软件中填写你申请所需的基本信息,如国家、公司、域名、邮箱、非对称算法等等。让后我们会得到两个文本文件。(xxx表示你申请的域名)
xxx.csr
这是需要发给CA机构申请证书用的文件
xxx.key
这是服务器非对称用的私钥
-
.csr 文件包含什么?
该文件解码后可以看到包含三部分信息:
- 域名基本信息
- 公钥,和上面的私钥是一对
- 签名
-
解释 签名
签名的过程:将1、2两部分信息进行 sha256 散列得到 hash 值,然后通过RSA算法对hash值进行加密,密钥为上面提到的私钥。
签名的作用:提供给CA校验该csr文件的有效性。CA收到csr后,使用公钥解密,然后也将1、2部分信息进行hash,与解密的数据对比,相同则说明数据没有被篡改过。
-
为什么要先hash再加密,直接加密不行吗?
hash是一种摘要算法,元数据可能很大,直接对非常大的数据加密效率太低,密文也会很大,因此先对要加密的数据进行hash获取它的摘要信息,有效性是一样的。
-
CA 收到申请者的CSR文件后,进行审核,通过后就会下发证书文件。
证书文件
发回的证书可能包含两个文件:
-
申请域名的证书
-
证书链(包含多个节点,每个节点都是一份证书)
通常是.pem或.crt后缀的文本文件。
每个证书的内容主要也包含三部分:
- 基本信息,如证书颁发机构、有效期、证书申请信息
- 公钥,即服务器非对称用的公钥
- 签名,对上面部分进行hash再用 CA 的私钥加密签名(也是用于客户端验证证书的有效性)
客户端如何验证证书?
通常一个证书链有多个证书节点,这里我们拿有3个节点的链举例:
- DST Root CA X3 根证书节点
- Let's Encrypt Authority X3 中间证书节点
- xxx.com 申请者自己的证书
- Let's Encrypt Authority X3 中间证书节点
证书链是环环相扣,由根节点签发中间节点,中间节点签发域名证书。
- 验证流程:
- 客户端访问 xxx.com 时,服务器会返回证书链;
- 客户端首先判断 xxx.com 证书是否可信,主要是通过验证签名,这里就需要加密这个证书的公钥。即中间节点的CA公钥。
- 因此去中间节点寻找公钥,中间节点证书第二部分就是CA的公钥,但我们还不能保证中间节点证书的有效性,因此还需先对中间节点进行签名验证,这时就需要去根节点找公钥。
- 根节点CA包括一些非常权威的CA机构,他们的证书库通常被内置在操作系统中或浏览器中。我们找到根节点的CA公钥,然后一步步回去验证下面节点的有效性。都验证通过了,则该证书有效。客户端获得了服务器的公钥可以进行非对称加密了。
HTTPS通信大致过程
- 建立tcp连接
- 开始TSL握手
- client hello
- server hello
- server发送证书、非对称公钥
- client回传PreMaster Key
- 生成对称加密密钥Master Key,结束
- 开始对称加密传输
具体流程可看我的博客《抓包观察TSL1.2握手过程》