飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • HTTP 基础

    • 认识HTTP协议与应用层定位
    • HTTP消息格式与报文结构
    • HTTP请求方法与幂等性
    • HTTP状态码详解
  • 连接与缓存

    • HTTP持久连接与版本演进
    • HTTP缓存机制
  • 状态与协商

    • Cookie与Session状态管理
    • HTTP重定向与内容协商
    • HTTP条件请求与范围请求
  • 安全与加密

    • HTTP认证机制
    • HTTPS与TLS握手
  • 协议演进

    • HTTP2核心特性
    • HTTP3与QUIC
  • 架构与实战

    • HTTP代理服务器与Web缓存
    • HTTP常见攻击与防御
    • HTTP实践工具与抓包分析

HTTPS与TLS握手

概念引入

想象飞翔科技的官网 www.feixiang.net 是一家线上门店。HTTP 相当于"敞开门做生意"——任何人都能站在旁边偷听顾客和店员的对话、篡改订单内容、甚至冒充店员骗钱。

HTTPS(HTTP Secure)就是给这家店装上防弹玻璃和身份识别系统:

  • 防窃听:对话加密,旁人听不懂
  • 防篡改:数据带"封条",拆开即知
  • 防冒充:店员出示"营业执照"(数字证书),顾客可验证真伪

HTTPS = HTTP + TLS(Transport Layer Security,传输层安全协议),默认端口 443。TLS 的前身是 SSL,所以有时也叫 SSL/TLS。

飞翔场景:雁姐(用户运营)处理用户隐私数据,靓晴(UI设计)上传设计稿,都必须走 HTTPS。翼王(架构师)说:"全站 HTTPS 是底线,不是选项。"


核心内容

为什么需要 HTTPS

数字证书:服务器的"营业执照"

数字证书(Digital Certificate)由 CA(Certificate Authority,证书颁发机构)签发,包含:

  • 服务器的公钥
  • 域名(如 www.feixiang.net)
  • 有效期
  • CA 的数字签名

就像营业执照上有工商局盖章,证书上有 CA 的签名。浏览器内置了可信 CA 的公钥,可以验证签名真伪。

TLS 1.2 握手:四步成交

TLS 1.2 握手需要 2-RTT(2 个往返时延),就像买卖双方四次对话敲定交易:

关键步骤解析:

  1. ClientHello:客户端打招呼,列出支持的 TLS 版本和密码套件(如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),发送随机数 A。

  2. ServerHello + Certificate:服务器回应,选定 TLS 版本和密码套件,发送随机数 B 和证书。

  3. ClientKeyExchange:客户端验证证书后,用服务器公钥加密一个"预主密钥"(Pre-Master Secret)发送。双方用随机数 A + 随机数 B + 预主密钥,计算出相同的会话密钥(Session Key)。

  4. ChangeCipherSpec:通知对方"后续用会话密钥加密"。Finished 消息是对整个握手过程的摘要,验证握手未被篡改。

密码套件命名:TLS_密钥交换_身份认证_WITH_对称加密_消息认证

TLS 1.3:更快更安全

TLS 1.3 做了大幅简化:

特性TLS 1.2TLS 1.3
握手 RTT2-RTT1-RTT(甚至 0-RTT 会话恢复)
密码套件复杂多样仅保留安全的,废弃 RSA 密钥交换、MD5/SHA-1
加密模式多种仅 AEAD(如 AES-GCM、ChaCha20-Poly1305)
握手明文部分握手数据明文除 ClientHello 外全部加密

0-RTT(零往返)会话恢复:如果客户端之前连过该服务器,可以把会话密钥相关信息直接放在第一个包,省去握手延迟。代价是可能受重放攻击,需谨慎启用。

证书验证要点

浏览器连接 HTTPS 网站时,会严格检查证书:

  1. 信任链:证书必须由内置 CA 签发,或链到可信根证书
  2. 有效期:证书是否在有效期内(过期会报警)
  3. 域名匹配:证书里的域名是否等于访问的域名(www.feixiang.net ≠ feixiang.net 会报警)
  4. 吊销检查:证书是否被 CA 撤销(通过 CRL 或 OCSP 查询)

飞翔场景:凌叔(运维)给官网配证书时,忘了把 feixiang.net 和 www.feixiang.net 都加到 SAN(Subject Alternative Name)里。结果访问不带 www 的域名时,浏览器报"证书与域名不匹配"。

安全增强:HSTS 与证书固定

HSTS(HTTP Strict Transport Security,严格传输安全):服务器告诉浏览器"未来 N 秒内,只准用 HTTPS 访问我,不准 HTTP"。防止用户被劫持到 HTTP 钓鱼页。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

证书固定(Certificate Pinning):客户端硬编码服务器证书的指纹,只认这一张证。即使 CA 被攻破签发假证,也骗不过客户端。但证书更新时要同步更新客户端,维护成本高。


本篇小结

  • HTTPS = HTTP + TLS,默认端口 443,解决 HTTP 的窃听、篡改、冒充三大问题
  • 数字证书由 CA 签发,含公钥、域名、有效期,是服务器身份的"营业执照"
  • TLS 1.2 握手需要 2-RTT,通过非对称加密交换预主密钥,再生成对称会话密钥
  • TLS 1.3 简化为 1-RTT,废弃不安全算法,仅支持 AEAD 加密,更安全高效
  • 证书验证需检查:CA 信任链、有效期、域名匹配、吊销状态(CRL/OCSP)
  • HSTS 强制浏览器只用 HTTPS 访问,证书固定防止 CA 被攻破后的中间人攻击
  • 生产环境务必使用 TLS 1.2+,优先 TLS 1.3,禁用不安全的密码套件

动手实践

温馨提示: 以下实践示例中涉及的域名(如 www.feixiang.net)、公司场景和接口均为虚构数据,仅用于演示协议原理,实际执行时可能不会产生文档中描述的效果。建议将命令中的域名替换为你自己可访问的真实地址进行练习。

实践:用 openssl 查看证书信息

# 查看飞翔官网的证书详情
openssl s_client -connect www.feixiang.net:443 -servername www.feixiang.net </dev/null 2>/dev/null | openssl x509 -text -noout

# 快速查看证书有效期和域名
openssl s_client -connect www.feixiang.net:443 -servername www.feixiang.net 2>/dev/null | openssl x509 -noout -dates -subject -issuer

实践:用 curl 检查 HTTPS 详情

# 查看 TLS 握手过程和证书链
curl -vI https://www.feixiang.net 2>&1 | grep -E "(TLS|SSL|subject|issuer|expire)"

# 指定 TLS 1.3 连接
curl --tlsv1.3 -I https://www.feixiang.net

实践:思考题

  1. 为什么 TLS 握手先用非对称加密(RSA/ECDHE),握手后却用对称加密(AES)传输数据?对称加密和非对称加密各有什么优缺点?
  2. 假设某个 CA 机构被黑客攻破,能随意签发 www.feixiang.net 的假证书。HSTS 能防御这种攻击吗?证书固定呢?
  3. 凌叔发现官网启用 HTTPS 后,部分老客户端(旧版 Android)无法访问。可能是什么原因?如何在不降低安全性的前提下兼容这些客户端?

查看思考题答案

上一页
HTTP认证机制