HTTPS 的“安全”其实是 TLS 协议在起作用。它解决三类风险:被窃听、被篡改、被冒充。核心就是——确认对方身份 + 建立只属于你们俩的加密通道 + 校验每一比特没被改过。
HTTPS 做了什么
-
机密性(Confidentiality):传输内容被对称加密(如 AES-GCM/ChaCha20-Poly1305),旁路看不懂。
-
完整性(Integrity):每个记录都带认证标签(AEAD/MAC),被改动会立刻验签失败。
-
认证(Authentication):服务器用数字证书证明“我就是 example.com”;浏览器用系统信任库验证它是否可信。
-
前向保密(PFS):用一次性的 ECDHE 密钥交换;就算将来服务器私钥泄露,过去抓到的流量也解不开。
-
抗降级:握手里含有“版本/套件回退”检测,阻止中间人强迫你用老旧弱算法。
-
重放/乱序防护:序列号 + 随机数 + 非ce,旧记录不能被复用。
简化的 TLS 1.3 握手(最常见)
-
ClientHello:浏览器发支持的版本、加密套件、随机数、以及临时公钥(ECDHE key share),并带 SNI(要访问的域名)。
-
ServerHello:服务器选择套件,回自己的临时公钥;双方立刻据此算出共享密钥。
-
服务器证明身份:发证书链(站点证书→中间 CA→根 CA),并对握手材料做数字签名。
-
浏览器验证证书:检查链是否可信、域名匹配、有效期/吊销(OCSP/Stapling)、证书透明度(CT)等。
-
密钥派生 & 加密通信:双方从共享秘密派生多把会话密钥,用于后续 HTTP 数据的加密与完整性校验。
双向认证(mTLS)时,客户端也会出示证书,常用于企业内网/接口。
证书信任是如何建立的
-
证书里包含站点公钥与域名信息,且由受信任的 CA用其私钥签名。
-
浏览器/系统内置一组根证书;验证“这张证书能层层追溯到某个受信根”,且域名匹配、未过期未吊销。
-
进阶:HSTS 强制域名只能走 HTTPS;证书透明度用公开日志发现误签;App 端可做**证书/公钥固定(Pinning)**防中间人。
与 HTTP 的关系
-
URL 还是同样的语义,只是把 HTTP 报文放进 TLS 的加密隧道里(“HTTP over TLS”)。
-
现代网站基本用 HTTPS + HTTP/2/HTTP/3(QUIC) :HTTP/3 在 UDP 上复用 TLS1.3 的安全性并减少时延。
它不解决什么
-
终端被攻破/中毒:对端已沦陷再强的传输加密也没用。
-
钓鱼站点:假域名拿到合法证书也能“绿锁”,用户仍会被骗;需要看清域名、用反钓鱼防护。
-
混合内容:HTTPS 页面里加载 HTTP 资源会被拦或降低安全性。
最佳实践(站点侧)
-
只用 TLS 1.2/1.3,优先 TLS 1.3 + ECDHE + AES-GCM/ChaCha20-Poly1305。
-
开启 HSTS,配置 OCSP stapling,使用证书透明度;自动续期(如 ACME/Let’s Encrypt)。
-
禁止混合内容、淘汰弱套件/旧协议、定期安全扫描。
一句话:HTTPS 通过“证书认证身份 + ECDHE 建立会话密钥 + AEAD 加密并校验完整性 + 前向保密”把 HTTP 放进一个只有你和服务器能读的安全隧道里,既防窃听又防篡改还防冒充。