https是如何保证安全的

96 阅读3分钟

HTTPS 的“安全”其实是 TLS 协议在起作用。它解决三类风险:被窃听、被篡改、被冒充。核心就是——确认对方身份 + 建立只属于你们俩的加密通道 + 校验每一比特没被改过

HTTPS 做了什么

  • 机密性(Confidentiality):传输内容被对称加密(如 AES-GCM/ChaCha20-Poly1305),旁路看不懂。

  • 完整性(Integrity):每个记录都带认证标签(AEAD/MAC),被改动会立刻验签失败。

  • 认证(Authentication):服务器用数字证书证明“我就是 example.com”;浏览器用系统信任库验证它是否可信。

  • 前向保密(PFS):用一次性的 ECDHE 密钥交换;就算将来服务器私钥泄露,过去抓到的流量也解不开。

  • 抗降级:握手里含有“版本/套件回退”检测,阻止中间人强迫你用老旧弱算法。

  • 重放/乱序防护:序列号 + 随机数 + 非ce,旧记录不能被复用。

简化的 TLS 1.3 握手(最常见)

  1. ClientHello:浏览器发支持的版本、加密套件、随机数、以及临时公钥(ECDHE key share),并带 SNI(要访问的域名)。

  2. ServerHello:服务器选择套件,回自己的临时公钥;双方立刻据此算出共享密钥。

  3. 服务器证明身份:发证书链(站点证书→中间 CA→根 CA),并对握手材料做数字签名

  4. 浏览器验证证书:检查链是否可信、域名匹配、有效期/吊销(OCSP/Stapling)、证书透明度(CT)等。

  5. 密钥派生 & 加密通信:双方从共享秘密派生多把会话密钥,用于后续 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 放进一个只有你和服务器能读的安全隧道里,既防窃听又防篡改还防冒充。