HTTPS与TLS究竟如何工作:分步指南
你大概见过浏览器里的挂锁图标,并默认你的连接是安全的。但当你访问一个HTTPS网站时,实际发生了什么?你的浏览器如何知道它正在与真正的服务器通信,而不是冒充者?为什么TLS有时会拖慢你的网站?
在本指南中,我们将逐步讲解握手过程,揭开HTTPS和TLS的神秘面纱。你将了解证书、对称与非对称加密的作用,以及如何在你自己项目中验证并优化TLS。
HTTPS和TLS实际做什么
HTTPS是构建在TLS(传输层安全)之上的HTTP。TLS提供三项保证:
- 机密性:数据被加密,窃听者无法读取。
- 完整性:数据在传输过程中被修改会被发现。
- 身份验证:你正在与合法服务器通信,而不是攻击者。
没有TLS,HTTP流量以明文发送。网络路径上的任何人(Wi-Fi热点、ISP、被攻陷的路由器)都能读取或篡改它。TLS通过在任何HTTP数据交换之前建立安全通道来解决这个问题。
TLS握手:逐步解析
握手是奇迹发生的地方。它是一个协商过程,用于建立共享密钥并验证身份。以下是TLS 1.2和1.3(你今天会遇到的两种版本)的简化流程。
第1步:Client Hello
客户端(浏览器)发送一条ClientHello消息,包含:
- 支持的TLS版本(例如TLS 1.3、TLS 1.2)
- 支持的密码套件(算法组合)
- 一个随机字节串(客户端随机数)
- 对于TLS 1.3,还包括用于Diffie-Hellman交换的密钥份额
第2步:Server Hello与证书
服务器以ServerHello(选定的版本、密码套件、服务器随机数)及其证书作为响应。证书包含服务器的公钥,并由证书颁发机构(CA)签名。
客户端验证证书:是否过期?是否由受信任的CA签发?域名是否匹配?如果不匹配,浏览器会显示警告。
第3步:密钥交换
使用服务器的公钥(或Diffie-Hellman参数),客户端和服务器推导出一个共享的预主密钥。在TLS 1.3中,这通过临时Diffie-Hellman(ECDHE)完成,提供前向保密:即使服务器的私钥后来被泄露,过去的会话仍然安全。
第4步:Finished
双方发送用新推导出的密钥加密的Finished消息。如果解密成功,握手就完成了。从那时起,所有应用数据(HTTP)都用对称加密(例如AES-GCM或ChaCha20-Poly1305)加密。
TLS 1.3的改进
TLS 1.3将握手减少到一次往返(1-RTT),并支持针对回访访客的0-RTT恢复。它还移除了过时的算法,使其更快、更安全。大多数现代浏览器和服务器都支持TLS 1.3。
TLS中的对称与非对称加密
TLS使用这两种加密类型是有充分理由的:
- 非对称(公钥)加密:在握手期间用于验证服务器身份并安全交换密钥。它的计算成本较高,但解决了密钥分发问题。
- 对称加密:在握手后用于批量数据传输。它快速且高效。
这种混合方法让你同时获得公钥加密的安全性和对称密码的性能。
证书:信任锚点
证书将公钥绑定到域名,并由CA签名。浏览器和操作系统附带一个受信任根CA的存储库。当服务器出示其证书时,客户端会构建一条回到受信任根的信任链。
证书有有限的生命周期(现在使用Let's Encrypt通常为90天)。过期证书会导致浏览器错误,因此请自动化续期。
实践:用OpenSSL检查TLS
你可以使用openssl命令行工具检查服务器的TLS配置。这有助于调试握手失败或验证密码套件。
openssl s_client -connect example.com:443 -servername example.com -tls1_3
这会连接到服务器并打印证书链、协商的密码和会话详情。查找Verify return code: 0 (ok)以确认证书有效。
检查证书过期时间:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
常见TLS陷阱及如何避免
- 证书过期:设置自动续期和监控。使用Certbot等工具处理Let's Encrypt。
- 混合内容:在HTTPS页面加载HTTP资源会破坏安全性。使用相对URL或确保所有资源都是HTTPS。
- 弱密码套件:禁用过时协议(TLS 1.0、1.1)和弱密码(RC4、3DES)。启用TLS 1.3。
- 缺少HSTS:添加
Strict-Transport-Security头,强制未来访问使用HTTPS。 - 证书链不完整:一些服务器忘记包含中间证书,导致某些客户端出错。使用SSL Labs进行测试。
优化TLS性能
TLS会因握手而增加延迟。以下是如何将其最小化:
- 启用TLS 1.3,它的握手更快。
- 使用会话恢复(会话票据或预共享密钥),避免回访访客进行完整握手。
- 启用OCSP装订,以减少证书验证延迟。
- 使用在边缘终止TLS的CDN,以减少往返时间。
- 保持证书小巧(尽可能使用ECDSA而不是RSA)。
常见问题
HTTPS和TLS有什么区别?
HTTPS是HTTP的安全版本,而TLS是提供安全性的密码协议。HTTPS使用TLS来加密和验证连接。
TLS如何提供前向保密?
前向保密确保即使服务器的私钥被泄露,过去的会话密钥也无法被推导出来。它通过在TLS 1.3和现代TLS 1.2配置中使用临时Diffie-Hellman密钥交换(ECDHE)来实现。
为什么我在某些网站上看到证书错误?
证书错误通常意味着证书已过期、自签名、为其他域名签发,或证书链不完整。浏览器拒绝此类证书,以保护你免受中间人攻击。
当你需要检查或调试TLS连接时,像Timestamp Converter这样的工具可以帮助你解码证书有效期并调试与时间相关的问题。