一、 术语解释
1. 公钥:公钥主要用于加密数据。数据一旦用公钥加密,只有对应的私钥才能解密。公钥还用于验证使用相应私钥生成的数字签名,确保数据的完整性和来源的真实性。公钥是可以公开分享的密钥,任何人都可以使用它。
2. 私钥:私钥用于解密用公钥加密的数据。私钥用于生成数字签名,以证明数据的来源和完整性。私钥是必须保密的密钥,只有密钥的所有者才能使用。
3. 证书:指的是数字证书,用于验证一个实体(服务器或客户端)的身份。每个证书都包含一个公钥和数字签名,证书是用来证明这个公钥是有效的、可信的。
4. 证书链:证书链指的是一系列的数字证书,这些证书具有上下级关系,分别为实体证书、中间证书、根证书。证书链的作用是可以通过逐级验证上一级证书的有效性来证明实体证书的有效性,例如可以用上一级证书的公钥来验证下一级证书的数字签名是否正确,如果正确的话那么说明下一级证书是被上一级证书认可的。对于根证书来说,他是自签名的(就是只能通过根证书的公钥来验证这个根证书的签名)一般由广被信任的机构颁发。
- 实体证书(也称为终端证书或叶子证书):这是证书链的起点,直接属于请求证书的实体(如服务器或客户端)。它包含实体的公钥和一些身份信息。
- 中间证书:这些证书由更高级别的证书颁发机构(CA)颁发。中间证书用于签名下一级的证书,可以有多个层级。
- 根证书:这是证书链的终点,由根证书颁发机构(Root CA)颁发。根证书是自签名的,它自己证明自己是可信的
二、 QUIC握手加密过程
1. 客户端发送Initial Packet给服务器,这个Packet是不加密的
2. 服务器收到Initial Packet后,生成一个相应的Initial Packet,这个Packet包括服务器的证书链
3. 客户端收到服务器的Initial Packet后通过自己的证书池验证对方的证书链,并从实体证书中获取服务器的公钥。客户端发送Handshake Packet,并用这个公钥对该Packet进行加密。此外,客户端还会生成一个临时秘钥对,并把这个临时秘钥对中的公钥封装在Handshake Packet中
4. 服务器收到Handshake Packet后通过自己的私钥对这个Packet进行解密,并生成自己的一个临时秘钥对。服务器使用客户端的临时公钥和自己的临时私钥生成一个共享秘钥材料,并通过客户端发来的随机数、服务器随机数和这个共享密钥生成主密钥。最后其临时公钥封装在Handshake Packet发送给客户端
5.客户端收到Handshake后使用自己的私钥解密,获得服务器临时公钥和服务器随机数。通过服务器临时公钥、自己的临时私钥生成和服务器相同的共享密钥材料,并通过这个共享秘钥、客户端随机数和服务器随机数生成主密钥。
6. 当客户端和服务器都有主密钥后,就可以通过主密钥派生出的秘钥进行加密和解密了,派生出的秘钥包括
- 客户端发送密钥(用于加密从客户端到服务器的数据)。
- 客户端接收密钥(用于解密从服务器到客户端的数据)。
- 服务器发送密钥(用于加密从服务器到客户端的数据)。
- 服务器接收密钥(用于解密从客户端到服务器的数据)