HTTPS报文在SSL/TLS证书安全隧道传输的原理
HTTPS 是基于 TLS/SSL 协议的安全通信协议。通常,HTTPS 的认证和加密过程包括以下步骤。
单向认证(常见的HTTPS请求)
① 客户端发送请求给服务器时,服务器会发送自己的证书(server.crt)给客户端,证书中还包含公钥信息、域名信息、证书颁发机构,私钥(server.key)服务端自己留着用不对外公开;
② 客户端验证服务器证书是否由受信任的证书颁发机构(CA)签发、是否过期,并检查证书是否有效,如果验证通过,客户端信任服务器;
③ 客户端和服务器通过一种密钥交换算法(如 RSA 或 Diffie-Hellman)协商出一个对称加密密钥,用于后续的通信加密;
双向认证(需要客户端证书的HTTPS请求)
在双向认证中,除了服务器需要提供证书,客户端也需要提供自己的证书。
① 服务器证书验证:客户端验证服务器的证书,确保服务器是可信的。
② 客户端证书验证:客户端向服务器发送自己的证书(client.crt);服务器验证客户端证书是否由受信任的 CA 签发,并检查证书是否有效,如果验证通过,服务器信任客户端。服务器向客户端发送一个随机数(或挑战),服务器要求客户端使用自己的私钥(client.key)对随机数进行签名,客户端使用私钥对随机数进行签名并将签名结果发送给服务器,服务器使用客户端证书中的公钥(client.crt)验证签名或者解密数据服务器会检查随机数是否与之前发送的值匹配,如果签名验证通过,服务器确认客户端的身份。
③ 秘钥协商与加密:双方协商出一个对称加密密钥,用于后续的通信加密。客户端通过秘钥算法生成预主密钥后使用服务器证书中的公钥加密预主密钥(对称秘钥),并发送给服务器,服务器收到秘钥后用私钥解密
随机数(挑战)发送时机
在 TLS 握手阶段,客户端和服务器会分别发送随机数(Client Random 和 Server Random),用于密钥协商。
在双向认证中,服务器会在握手阶段生成随机数(挑战),用于验证客户端的身份。
随机数是服务器生成的,用于防止重放攻击;客户端对随机数进行签名,服务器验证签名,确保签名是由客户端的私钥生成的。
是否每次 HTTPS 请求都需要重新建立 TLS 会话?
不一定。这取决于是否启用了会话复用机制。
① 情况 1:不启用会话复用
每次 HTTPS 请求都会重新建立一个新的 TLS 会话。
每次握手都会生成新的随机数(ClientHello 和 ServerHello 中的随机数),并协商出新的对称加密密钥。
双向认证的身份验证(如客户端证书验证)会在每次握手中重复进行。
② 情况 2:启用会话复用
如果客户端和服务器支持会话复用(Session Resumption),后续的 HTTPS 请求可以复用之前的 TLS 会话。
会话复用时,不需要重新进行完整的 TLS 握手,也不会生成新的随机数和对称加密密钥。
双向认证的身份验证通常不会重复进行,因为服务器已经在之前的会话中验证过客户端的身份。
③ 总结 1:实际应用中的情况
在实际应用中,是否每次 HTTPS 请求都重新建立 TLS 会话,取决于以下因素:
服务器配置:服务器是否支持会话复用(Session Resumption)。
客户端配置:客户端是否支持会话复用。
安全需求:某些高安全性场景可能会禁用会话复用,强制每次请求都重新建立 TLS 会话。
双向认证通常用于高安全性场景(如银行系统、企业内部系统)。
在这些场景中,每次请求都需要验证客户端的身份,以确保请求是由合法客户端发起的。
如何判断服务器是否开启双向认证?
1、安装openssl
2、cmd输入
openssl s_client -connect www.114.com:443 -servername www.114.com -status
这行信息是OpenSSL工具直接报告的结果,明确表示服务器没有发送任何可接受的客户端证书CA名称列表。这意味着服务器在SSL/TLS握手过程中,并没有向客户端请求或要求提供客户端证书。