别只会说 HTTPS 更安全:一文吃透加密、证书与 TLS 握手

📅 2026/7/3 7:00:00
别只会说 HTTPS 更安全:一文吃透加密、证书与 TLS 握手
HTTP 连接建立相对简单 TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后还需进行 SSL/TLS 的握手过程才可进入加密报文传输。两者的默认端口不一样HTTP 默认端口号是 80HTTPS 默认端口号是 443。HTTPS 协议需要向 CA证书权威机构申请数字证书来保证服务器的身份是可信的。HTTP 由于是明文传输所以安全上存在以下三个风险窃听风险通信使用明文不加密内容可能会被窃听篡改风险无法证明报文的完整性所以有可能已遭篡改冒充风险不验证通信方的身份因此有可能遭遇伪装HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议可以解决上述的风险信息加密混合加密的方式实现信息的机密性解决了窃听的风险。校验机制摘要算法的方式来实现完整性它能够为数据生成独一无二的「指纹」指纹用于校验数据的完整性解决了篡改的风险。身份证书将服务器公钥放入到数字证书中解决了冒充的风险。混合加密HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式在通信建立前采用非对称加密的方式交换会话秘钥这个会话密钥就是对称密钥)后续就不再使用非对称加密。在通信过程中全部使用 会话秘钥 来加密明文数据。采用混合加密的原因对称加密只使用一个密钥运算速度快密钥必须保密无法做到安全的密钥交换。非对称加密使用两个密钥公钥和私钥公钥可以任意分发而私钥保密解决了密钥交换问题但速度慢。摘要算法 数字签名为了保证传输的内容不被篡改需要对内容hash出一个「指纹」然后同内容一起传输给对方。对方收到后先是对内容也hash出一个「指纹」然后跟发送方发送的「指纹」做一个比较如果「指纹」相同说明内容没有被篡改否则就可以判断出内容被篡改了。通过哈希算法可以确保内容不会被篡改但是并不能保证「内容 哈希值」不会同时被替换因此就有了数字签名。这里一般会用非对称加密算法来解决共有两个密钥公钥可以公开给所有人私钥必须由本人管理不可泄露。这两个密钥可以双向加解密的比如可以用公钥加密内容然后用私钥解密也可以用私钥加密内容公钥解密内容。流程的不同意味着目的也不相同公钥加密私钥解密。这个目的是为了保证内容传输的安全因为被公钥加密的内容其他人是无法解密的只有持有私钥的人才能解密出实际的内容但是这种方式效率低一般还是用对称密钥加密内容私钥加密公钥解密。这个目的是为了保证消息不会被冒充因为私钥是不可泄露的如果公钥能正常解密出私钥加密的内容就能证明这个消息是来源于持有私钥身份的人发送的。所以非对称加密的用途主要在于通过「私钥加密公钥解密」的方式来确认消息的身份常说的数字签名算法就是用的是这种方式不过私钥加密内容不是内容本身而是对内容的哈希值加密。私钥是由服务端保管然后服务端会向客户端颁发对应的公钥。如果客户端收到的信息能被公钥解密就说明该消息是由服务器发送的。数字证书以上流程如下通过哈希算法来保证消息的完整性再通过数字签名来保证消息的指纹不被篡改用服务器私钥加密hash值客户端用公钥解密保证消息是由私钥方发送的虽然服务器持有私钥客户端能通过服务器的公钥解密来确认这个hash消息是不是来源于服务器。但如果有黑客同时伪造公私钥并将公钥发送给客户端之后的会话密钥协商也用这个公钥来协商那之后的消息发送黑客都能解密。因此需要保证公钥是来自于服务器的权威的机构是 CA 数字证书认证机构将服务器公钥放在数字证书由数字证书认证机构颁发中只要证书是可信的公钥就是可信的。数字证书的工作流程通过数字证书的方式保证服务器公钥的身份解决冒充的风险。数字证书的验证过程如下图图所示为数字证书签发和验证流程CA 签发证书的过程首先 CA 会把持有者一般是服务器的公钥、用途、颁发者、有效时间等信息打成一个包然后对这些信息进行 Hash 计算得到一个 Hash 值然后 CA 会使用自己的私钥将该 Hash 值加密生成 Certificate Signature也就是 CA 对证书做了签名最后将 Certificate Signature 添加在文件证书上形成数字证书客户端校验服务端的数字证书的过程如上图右边部分首先客户端会使用同样的 Hash 算法把持有者一般是服务器的公钥、用途、颁发者、有效时间等信息进行计算得到 Hash 值 H1通常浏览器和操作系统中集成了 CA 的公钥信息浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容得到一个 Hash 值 H2 最后比较 H1 和 H2如果值相同则为可信赖的证书否则则认为证书不可信。但事实上证书的验证过程中还存在一个证书信任链的问题因为向 CA 申请的证书一般不是根证书签发的而是由中间证书签发的比如百度的证书从下图你可以看到证书的层级有三级对于这种三级层级关系的证书的验证过程如下客户端收到 baidu.com 的证书后发现这个证书的签发者不是根证书就无法根据本地已有的根证书中的公钥去验证 baidu.com 证书是否可信。于是客户端根据 baidu.com 证书中的签发者找到该证书的颁发机构是 “GlobalSign Organization Validation CA - SHA256 - G2”然后向 CA 请求该中间证书。请求到证书后发现 “GlobalSign Organization Validation CA - SHA256 - G2” 证书是由 “GlobalSign Root CA” 签发的由于 “GlobalSign Root CA” 没有再上级签发机构说明它是根证书也就是自签证书。应用软件会检查此证书有否已预载于根证书清单上如果有则可以利用根证书中的公钥去验证 “GlobalSign Organization Validation CA - SHA256 - G2” 证书如果发现验证通过就认为该中间证书是可信的。“GlobalSign Organization Validation CA - SHA256 - G2” 证书被信任后可以使用 “GlobalSign Organization Validation CA - SHA256 - G2” 证书中的公钥去验证 baidu.com 证书的可信性如果验证通过就可以信任 baidu.com 证书。总括来说由于用户信任 GlobalSign所以由 GlobalSign 所担保的 baidu.com 可以被信任另外由于用户信任操作系统或浏览器的软件商所以由软件商预载了根证书的 GlobalSign 都可被信任。操作系统里一般都会内置一些根证书这样的一层层地验证就构成了一条信任链路整个证书信任链验证流程如下图所示小结HTTPS是如何保证安全性的无法保证内容是安全的因此通过对称加密算法加密传输内容无法保证整个传输内容不会被篡改因此hash内容来保证内容的完整性无法保证 内容hash值 不会被同时替换因此使用数字签名算法使用服务端私钥加密hash值保证hash来自私钥方无法保证公钥私钥的分发来自服务器因此引入数字证书引入CA确保可信TLS握手SSL/TLS 协议基本流程客户端向服务器索要并验证服务器的公钥。双方协商生产「会话秘钥」。双方采用「会话秘钥」进行加密通信。前两步也就是 SSL/TLS 的建立过程也就是 TLS 握手阶段。TLS 的握手阶段涉及四次通信使用不同的密钥交换算法TLS 握手流程也会不一样的现在常用的密钥交换算法有两种RSA 算法 (opens new window)和 ECDHE 算法 (opens new window)。RSA算法基于 RSA 算法的握手过程如下图TLS 协议建立的详细流程ClientHello首先由客户端向服务器发起加密通信请求也就是 ClientHello 请求。在这一步客户端主要向服务器发送以下信息客户端支持的 TLS 协议版本如 TLS 1.2 版本。客户端生产的随机数Client Random后面用于生成「会话秘钥」条件之一。客户端支持的密码套件列表如 RSA 加密算法。SeverHello服务器收到客户端请求后向客户端发出响应也就是 SeverHello。服务器回应的内容有如下内容确认 TLS 协议版本如果浏览器不支持则关闭加密通信。服务器生产的随机数Server Random也是后面用于生产「会话秘钥」条件之一。确认的密码套件列表如 RSA 加密算法。服务器的数字证书。客户端回应客户端收到服务器的回应之后首先通过浏览器或者操作系统中的 CA 公钥确认服务器的数字证书的真实性。如果证书没有问题客户端会从数字证书中取出服务器的公钥然后使用它加密报文向服务器发送如下信息一个随机数pre-master key。该随机数会被服务器公钥加密。上面的随机数pre-master key是整个握手阶段的第三个随机数会发给服务端所以这个随机数客户端和服务端都是一样的。客户端有了这三个随机数Client Random、Server Random、pre-master key接着就用双方协商的加密算法各自生成本次通信的「会话秘钥」。加密通信算法改变通知表示随后的信息都将用「会话秘钥」加密通信。客户端握手结束通知表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要用来供服务端校验。服务器的最后回应服务器收到客户端的第三个随机数pre-master key之后也就有了三个随机数通过协商的加密算法计算出本次通信的「会话秘钥」。然后向客户端发送最后的信息加密通信算法改变通知表示随后的信息都将用「会话秘钥」加密通信。服务器握手结束通知表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要用来供客户端校验。至此整个 TLS 的握手阶段全部结束。接下来客户端与服务器进入加密通信就完全是使用普通的 HTTP 协议只不过会用「会话秘钥」加密内容。RSA算法的不足使用 RSA 密钥协商算法的最大问题是不支持前向安全性。因为客户端传递随机数用于生成对称加密密钥的条件之一给服务端时使用的是公钥加密的服务端收到后会用私钥解密得到随机数。所以一旦服务端的私钥泄漏了过去被第三方截获的所有 TLS 通讯密文都会被破解。前向安全和后向安全前向安全Forward Security前向安全能保证了当前密钥被攻击者获取后历史的密钥仍然是安全的也就是说历史的通讯密文都是安全的。后向安全Backward Security后向安全性是指能保证当前密钥被攻击者获取后未来的密钥仍然是安全的也就是说以后的通讯密文都是安全的ECDHE 算法ECDHE 密钥协商算法是由 DH 算法演进来的。DH算法DH算法解决了密钥在双方不直接传递密钥的情况下完成密钥交换算法步骤如下Alice计算A选择1个素数p比如509底数g 比如5选择一个随机数a 123然后计算 A g^a (mod p) 5^a (mod 509) 215Alice现在有[p509,g5,a123,A215], 把pgA发送给Bob随机数a私有Bob计算B和密钥s收到 p 509g 5 后选择一个随机数b 456计算 B g^b (mod p) 5^456 (mod 509) 181计算密钥 S A^b (mod p) 215^456 (mod 509) 121Bob现在有[p509,g5,b456,B181,s121,A125]把B181发送给Alice随机数b私有Alice计算密钥sAlice现在有[p,g,a,A,B]Alice计算 S B^a (mod p) 181^123 (mod 509)121最终双方协商出的密钥S是121。注意到这个密钥s并没有在网络上传输。而通过网络传输的pgA和B是无法推算出s的因为根据离散对数的原理从真数A 和 B反向计算对数 a 和 b 是非常困难的并且实际算法选择的素数是非常大的。DHE 算法根据私钥生成的方式DH 算法分为两种实现static DH 算法废弃DHE 算法static DH 算法里有一方的私钥是静态的也就说每次密钥协商的时候有一方的私钥都是一样的一般是服务器方固定即 随机数a 不变客户端的私钥则是随机生成的。假设Alice是服务器端Bob是客户端那么DH 交换密钥时就只有客户端的公钥即B在变化而服务端公钥即A是不变的那么随着时间延长黑客就会截获海量的密钥协商过程的数据因为密钥协商的过程有些数据是公开的黑客就可以依据这些数据暴力破解出服务器的私钥即a然后就可以计算出会话密钥了于是之前截获的加密数据会被破解所以 static DH 算法不具备前向安全性。DHE 算法E 全称是 ephemeral临时性的。即让双方的私钥(即a、b)在每次密钥交换通信时都进行随机生成ECDHE 算法ECDHE 算法是在 DHE 算法的基础上利用了 ECC 椭圆曲线特性可以用更少的计算量计算出公钥以及最终的会话密钥。ECDHE 密钥交换算法的过程双方事先确定好使用哪种椭圆曲线和曲线上的基点 G这两个参数都是公开的双方各自随机生成一个随机数作为私钥d并与基点 G相乘得到公钥QQ dG此时Alice的公私钥为 Q1 和 d1Bob的公私钥为 Q2 和 d2双方交换各自的公钥最后Alice计算点x1y1 d1Q2Bob计算点x2y2 d2Q1由于椭圆曲线上是可以满足乘法交换和结合律所以 d1Q2 d1d2G d2d1G d2Q1 因此双方的 x 坐标是一样的所以它是共享密钥也就是会话密钥。这个过程中双方的私钥d都是随机、临时生成的都是不公开的即使根据公开的信息椭圆曲线、公钥、基点 G也是很难计算出椭圆曲线上的离散对数私钥ECDHE 握手过程基于ECDHE算法的握手流程图如下第一次握手ClientHello首先由客户端向服务器发起加密通信请求也就是 ClientHello 请求。在这一步客户端主要向服务器发送以下信息客户端支持的 TLS 协议版本Version如 TLS 1.2 版本。客户端生产的随机数Client Random后面用于生成「会话秘钥」条件之一。客户端支持的密码套件列表。第二次握手SeverHello服务器收到客户端请求后向客户端发出响应也就是 SeverHello。服务器回应的内容有如下内容确认 TLS 协议版本Version如果浏览器不支持则关闭加密通信。服务器生产的随机数Server Random也是后面用于生产「会话秘钥」条件之一。确认的密码套件列表如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。Certificate服务器为了证明身份会给客户端发送数字证书包括CA机构为服务器颁发的公钥、CA机构签名等信息Server Key Exchange这步是ECDHE算法与RSA算法的不同之处服务器会在发送证书后再发送 Server Key Exchange 消息给客户端包括椭圆曲线公钥 Server Params用来实现密钥交换密钥协商再加上自己的私钥签名认证签名算法为RSAServer Hello Done :通知客户端所有消息已经发送完毕