编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 计算机原理

  • 网络协议

    • README
    • 通过看新闻熟悉网络
    • 通过购物熟悉加密
    • 从0到1部书电商网站
    • 请求网络的通用流程
    • 网络编程模型的概念
    • 传输协议TCP和UDP
    • Socket的发展和设计
    • 传输数据的设计思想
    • 网络域名解析的流程
    • HTTP服务设计流程
    • HTTP协议设计思想
    • HTTPS协议设计策略
      • 01.工作案例引入
        • 1.1 一个小程序上线的HTTPS五连击
        • 1.2 事故背后的HTTPS安全知识图谱
      • 02.为何会有Https
        • 2.1 Http的缺点
        • 2.2 Http缺点解决方案
        • 2.3 Http的风险
        • 2.4 如何避免风险
      • 03.解决方案分析
        • 3.1 Https加密方式
        • 3.2 SSL是什么
        • 3.3 SSL原理是什么
      • 04.SSL存在隐患
        • 4.1 RSA验证的隐患
        • 4.2 中间方伪造公钥和私钥
        • 4.3 存在两类问题
      • 05.CA证书解决SSL隐患
        • 5.1 如何解决SSL隐患
        • 5.2 CA证书流程原理
      • 06.Https工作流程
        • 6.1 工作流程图
        • 6.2 详细流程说明
      • 07.Https真安全吗
        • 7.1 Https代理了解
        • 7.2 charles抓包流程
      • 08.Https性能分析
        • 8.1 HTTPS性能损耗
        • 8.2 HTTPS接入优化
      • 09.TLS协议深度解析
        • 9.1 TLS记录协议
        • 9.2 TLS握手协议详解
        • 9.3 密钥导出过程
        • 9.4 TLS 1.3的改进
      • 10.HTTPS安全攻防
        • 10.1 SSL剥离攻击
        • 10.2 降级攻击防护
        • 10.3 证书固定(Pinning)
        • 10.4 HPKP的兴衰
      • 11.HTTPS部署实践
        • 11.1 证书申请与管理
        • 11.2 服务器配置最佳实践
        • 11.3 安全评估与测试
        • 11.4 常见问题排查
      • 12.综合案例:从0到1部署生产级HTTPS服务
        • 12.1 案例背景与目标
        • 12.2 第一站:HTTP裸奔——零安全基线
        • 12.3 第二站:自签名证书——有加密没信任
        • 12.4 第三站:Let's Encrypt——信任但不完美
        • 12.5 第四站:生产级加固——A+评级
        • 12.6 四种方案横向对比
        • 12.7 案例升华:HTTPS的攻防哲学
        • 12.8 全文知识图谱回顾
      • 13.思考题与作业
        • 13.1 基础思考题
        • 13.2 进阶思考题
        • 13.3 动手作业
    • HTTP连接和跳转
    • HTTP代理和缓存设计
    • 如何去排查网络故障
    • WebSocket实时通信
    • HTTP3与QUIC协议
  • 操作系统

  • 数据库原理

  • 计算机
  • 网络协议
杨充
2023-03-24
目录

HTTPS协议设计策略

# 12.Https协议设计策略

# 目录介绍

  • 01.工作案例引入
    • 1.1 一个小程序上线的HTTPS五连击
    • 1.2 事故背后的HTTPS安全知识图谱
  • 02.为何会有Https
    • 2.1 Http的缺点
    • 2.2 Http缺点解决方案
    • 2.3 Http的风险
    • 2.4 如何避免风险
  • 03.解决方案分析
    • 3.1 Https加密方式
    • 3.2 SSL是什么
    • 3.3 SSL原理是什么
  • 04.SSL存在隐患
    • 4.1 RSA验证的隐患
    • 4.2 中间方伪造公钥和私钥
    • 4.3 存在两类问题
  • 05.CA证书解决SSL隐患
    • 5.1 如何解决SSL隐患
    • 5.2 CA证书流程原理
  • 06.Https工作流程
    • 6.1 工作流程图
    • 6.2 详细流程说明
  • 07.Https真安全吗
    • 7.1 Https代理了解
    • 7.2 charles抓包流程
  • 08.Https性能分析
    • 8.1 HTTPS性能损耗
    • 8.2 HTTPS接入优化
  • 09.TLS协议深度解析
    • 9.1 TLS记录协议
    • 9.2 TLS握手协议详解
    • 9.3 密钥导出过程
    • 9.4 TLS 1.3的改进
  • 10.HTTPS安全攻防
    • 10.1 SSL剥离攻击
    • 10.2 降级攻击防护
    • 10.3 证书固定(Pinning)
    • 10.4 HPKP的兴衰
  • 11.HTTPS部署实践
    • 11.1 证书申请与管理
    • 11.2 服务器配置最佳实践
    • 11.3 安全评估与测试
    • 11.4 常见问题排查
  • 12.综合案例:从0到1部署生产级HTTPS服务
    • 12.1 案例背景与目标
    • 12.2 第一站:HTTP裸奔(零安全基线)
    • 12.3 第二站:自签名证书(有加密没信任)
    • 12.4 第三站:Let's Encrypt(信任但不完美)
    • 12.5 第四站:生产级加固(A+评级)
    • 12.6 四种方案横向对比
    • 12.7 案例升华:HTTPS的攻防哲学
    • 12.8 全文知识图谱回顾
  • 13.思考题与作业
    • 13.1 基础思考题
    • 13.2 进阶思考题
    • 13.3 动手作业

# 01.工作案例引入

# 1.1 一个小程序上线的HTTPS五连击

场景:小陈是一名前端工程师,负责公司新开发的小程序。测试环境一切正常——后端接口 http://192.168.1.100:8080/api 返回数据杠杠的。准备上线时,遇到了一连串令人头疼的问题。

事故 ① —— "小程序要求必须用 HTTPS,不能用 HTTP":小陈把接口地址改成线上服务器的 http://api.company.com 提交代码,小程序后台审核直接驳回——微信要求所有网络请求必须使用 HTTPS。小陈心想,不就是加个证书嘛。

事故 ② —— "自己签了个证书,浏览器显示红色警告":小陈用 openssl 生成了一个自签名证书部署到 Nginx 上。浏览器访问时弹出一个全屏红色警告:"您的连接不是私密连接",用户根本不敢点"继续访问"。测试同事问:"这网站真的是咱们公司的吗?"

事故 ③ —— "买了正规证书,用户说在咖啡店连 WiFi 时密码被盗了":小陈去 CA 买了正规的 DV 证书,浏览器小锁头终于绿了。但一周后安全团队接到用户投诉——有人在星巴克公共 WiFi 上用 App 登录后,账号异地登录了。排查发现:攻击者在咖啡店 WiFi 上做了 SSL 剥离攻击,用户以为自己连的是 HTTPS,实际降级成了 HTTP。

事故 ④ —— "证书过期了三天才发现,用户全被挡在门外":网站平稳运行了三个月。某天凌晨三点,小陈被运维电话叫醒——用户反馈"网站打不开了"。排查发现证书过期。因为是 DV 证书有效期只有 90 天,小陈忘记续期,也没设监控告警。

事故 ⑤ —— "HSTS 配错了 max-age,想要回滚到 HTTP 时发现回不去了":小陈在 Nginx 上配置了 Strict-Transport-Security: max-age=31536000(1 年)。后来因为某个遗留系统不支持 HTTPS,需要临时让某个子域名走 HTTP——结果浏览器死活不干,用户被"锁死"在 HTTPS 上。Chrome 的 HSTS 预加载列表(Preload List)更是让这件事完全不可逆。

疑惑链条:

  • "为什么自签名证书浏览器不认?" → 浏览器内置了信任的 CA 根证书列表,自签名证书不在这个信任链里 → 需要从受信任的 CA 购买证书(对应第 5 章 CA 证书机制)
  • "有 HTTPS 为什么还会被盗密码?" → 用户可能访问的是 http:// 而不是 https://,中间人可以降级 → HSTS 强制浏览器只走 HTTPS(对应第 10.1 节 SSL 剥离攻击)
  • "证书过期怎么会导致网站完全无法访问?" → HTTPS 证书过期后,浏览器拒绝建立加密连接,用户连"继续访问"的按钮都没有(和自签名不同) → 需要自动续期 + 监控(对应第 11.1/11.4 节)
  • "HSTS 为什么配置了就回不了头?" → HSTS 的 max-age 被浏览器缓存后,在过期前浏览器拒绝任何 HTTP 访问 → 必须谨慎设置(对应第 10.2 节降级攻击防护)
  • "HTTPS 到底比 HTTP 多了什么?" → 多了 TLS 层——加密、身份验证、数据完整性三个核心能力(对应第 2/3/9 章)

小陈这一串问题,本质都是在问:HTTPS 的信任链是怎么建立的?加密到底防什么、不防什么?如何正确部署才能既安全又不给自己挖坑?——这正是"HTTPS 协议设计策略"要回答的。

# 1.2 事故背后的HTTPS安全知识图谱

把这次事故翻译成 HTTPS 安全知识语言:

用户在浏览器输入 https://www.company.com
    ↓ ① DNS解析(域名→IP)
    ↓ ② TCP三次握手
    ↓ ③ TLS握手
客户端 ←→ 服务器
  证书验证:(事故②的发生地)
    证书链是否合法?→ CA根证书是否在浏览器信任列表里?
    域名是否匹配? → CN/SAN是否包含当前域名?
    证书是否过期? → 事故④的发生地
  密钥协商:ECDHE/RSA → 生成对称密钥
    ↓ ④ 加密通信开始
  数据以 AES-GCM 等对称加密传输
    ↓
事故③的发生地(没有HSTS,被降级为HTTP)
事故⑤的发生地(HSTS配置过度,无法回退)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

五类事故与后续章节的映射关系:

事故 症状 根因所在的知识点 对应章节
① 小程序拒接HTTP 平台安全策略→强制HTTPS 02.HTTP风险
② 自签名证书被拒 无CA信任链→浏览器内置根证书 05.CA证书机制
③ 咖啡店密码被盗 SSL剥离攻击→无HSTS 10.安全攻防
④ 证书过期宕机 无自动续期+无监控 11.部署实践
⑤ HSTS锁死无法回退 max-age过长+HSTS预加载 10.降级防护

本章的主线就是沿着这五类事故,一层一层拆解 HTTPS 的加密原理、CA 信任体系、TLS 握手过程和部署最佳实践。读完之后,你不仅能避开这些坑,还能理解为什么 HTTPS 是互联网安全的基石、为什么 TLS 1.3 能省掉 1 个 RTT、为什么 Charles 能抓 HTTPS 包。

# 02.为何会有Https

# 2.1 Http的缺点

缺点1:通信使用明文——>易泄漏数据

  1. 通信使用明文意味着安全性大大降低,当通信过程被窃听后,无需花费额外的投入就可看到传输的数据。

缺点2:不验证通信方身份——>易被伪装抓取和乱响应

  1. 不验证通信方的身份,将导致通信过程被窃听后,可能会遭遇伪装。

缺点3:无法验证报文的完整性——>易被篡改内容

  1. 不验证报文的完整性,数据在传输过程中就可能被篡改。

回到事故①:这三种风险正是微信小程序强制要求 HTTPS 的根本原因——明文传输意味着用户在公共 WiFi 上的登录密码可以被任何人看到。

# 2.2 Http缺点解决方案

  1. 通信使用明文:使用密文进行通信,即便数据被窃听,对方需要花费极高的成本来破解。
  2. 不验证通信方身份:使用数字证书来验证身份。
  3. 无法验证报文的完整性:使用 MD5/SHA1 等算法进行完整性验证。

# 2.3 Http的风险

  1. 窃听风险:Http采用明文传输数据,第三方可以获知通信内容
  2. 篡改风险:第三方可以修改通信内容
  3. 冒充风险:第三方可以冒充他人身份进行通信

# 2.4 如何避免风险

SSL/TLS协议就是为了解决这些风险而设计:所有信息加密传输,具有校验机制,配备身份证书,防止身份被冒充。

# 03.解决方案分析

# 3.1 Https加密方式

Https=Http+Ssl:HTTPS保证了数据传输的安全,主要原理是利用非对称加密算法。

非对称加密算法之所以能实现安全传输的核心精华就是:公钥加密的信息只能用私钥解开,私钥加密的信息只能被公钥解开。

服务端申请CA机构颁发的证书,获取到证书的公钥和私钥。私钥只有服务器自己知道,而公钥可以告知其他人。客户端通过公钥加密传输的数据,服务端利用私钥解密。

# 3.2 SSL是什么

HTTPS协议中需要使用到SSL证书。SSL证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据。

证书按认证级别分类:

  • 域名认证(DV):最低级别的认证,可以确认申请人拥有这个域名
  • 公司认证(OV):确认域名所有人是哪家公司,证书里面包含公司的信息
  • 扩展认证(EV):最高级别认证,浏览器地址栏会显示公司名称

按覆盖范围分类:

  • 单域名证书:只能用于单域名
  • 通配符证书:可用于某个域名及所有一级子域名
  • 多域名证书:可用于多个域名

回到事故④:小陈买的是 DV 证书,有效期只有 90 天。DV 证书没有包含公司信息,验证只需 DNS/HTTP 验证即可,适合自动化签发(如 Let's Encrypt)。

# 3.3 SSL原理是什么

SSL(Secure Sokcet Layer,安全套接字层) 和 TLS(Transport Layer Security,传输层安全协议) 位于应用层与传输层之间。

SSL原理及运行过程:

  1. 采用公钥加密法:客户端向服务器索要公钥,然后用公钥加密信息,服务器收到密文,用自己的私钥解密。
  2. 为了防止公钥被篡改,把公钥放在数字证书中,证书可信则公钥可信。
  3. 公钥加密计算量很大,为了提高效率,服务端和客户端都生成对话密钥(对称加密),而公钥用来加密对话密钥。

# 04.SSL存在隐患

# 4.1 RSA验证的隐患

SSL/TLS采用公钥加密法(最有名的是RSA加密算法),但仍有风险隐患:RSA算法无法确保服务器身份的合法性,因为公钥并不包含服务器的信息,存在安全隐患。

# 4.2 中间方伪造公钥和私钥

举个例子说明:

  1. 客户端C和服务器S进行通信,中间节点M(伪造方)截获了二者的通信;
  2. 节点M计算产生一对公钥pub_M和私钥pri_M;
  3. C向S请求公钥时,M把自己的公钥pub_M发给了C;
  4. C使用公钥pub_M加密的数据能够被M解密,因为M掌握对应的私钥pri_M,而C无法根据公钥信息判断服务器的身份;
  5. 中间节点M和服务器S之间再建立合法的连接,因此C和S之间通信被M完全掌握。

# 4.3 存在两类问题

该方案下至少存在两类问题:中间人攻击和信息抵赖。

  • 中间人攻击:中间节点M伪造自己的公钥和私钥,然后拦截信息,进行篡改。
  • 信息抵赖:没办法校验服务端,信息不对称。

回到事故③的本质:中间人不需要"破解"HTTPS——他只需要让用户不走HTTPS就行(降级为HTTP)。这也是为什么 HSTS 如此重要。

# 05.CA证书解决SSL隐患

# 5.1 如何解决SSL隐患

CA 的初衷是为了解决上面非对称加密被劫持的情况:

服务器申请CA证书时将服务器的"公钥"提供给CA,CA使用自己的"私钥"将"服务器的公钥"加密后(即:CA证书)返回给服务器,服务器再将"CA证书"提供给客户端。

一般系统或者浏览器会内置 CA 的根证书(公钥),HTTPS 中 CA 证书的获取流程如下:服务器申请CA证书→CA用私钥签名→客户端用CA公钥验证证书合法性。

回到事故②:小陈的自签名证书不在浏览器内置的 CA 根证书列表里,所以浏览器无法找到信任的"根",只能警告用户。买一个 Let's Encrypt 或 DigiCert 的证书,本质就是让证书链能回溯到浏览器信任的根 CA。

# 5.2 CA证书流程原理

  • CA负责审核信息,然后对关键信息利用私钥进行"签名",公开对应的公钥,客户端可以利用公钥验证签名。
  • 注意:a.申请证书不需要提供私钥,确保私钥永远只能服务器掌握;b.证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;c.内置 CA 对应的证书称为根证书。
  • CA证书链:根证书root.pem → 中间证书inter.pem → 服务器证书server.pem的层级信任关系——如 CA根证书和服务器证书中间增加一级证书机构,即中间证书,证书的产生和验证原理不变,只是增加一层验证。

# 06.Https工作流程

# 6.1 工作流程图

HTTPS完整工作流程:证书验证→公钥加密随机数→生成对称密钥→加密传输。

# 6.2 详细流程说明

  • 客户端发起HTTPS请求:用户在浏览器里输入一个https网址,连接到server的443端口。
  • 服务端的配置:采用HTTPS协议的服务器必须要有一套数字证书。
  • 传送证书:服务器端会有一套数字证书发送给客户端,这个证书其实就是公钥。
  • 客户端解析证书:客户端的TLS验证公钥是否有效,比如颁发机构、过期时间等等。
  • 客户端传送加密信息:用证书加密后生成的随机值,让服务端得到这个随机值,后续通信通过这个随机值进行加解密。
  • 服务端解密信息:服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该值进行对称加密。
  • 传输加密后的信息:服务端用对称密钥加密后的信息,可以在客户端被还原。
  • 客户端解密信息:客户端用之前生成的对称密钥解密服务端传过来的信息。

# 07.Https真安全吗

# 7.1 Https代理了解

HTTPS代理的作用:提高访问速度、起到防火墙的作用、通过代理访问受限网站、安全性得到提高。

# 7.2 charles抓包流程

Charles抓包原理:Charles作为中间人代理,拿到了服务器证书公钥和HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会"报警"并中止连接。

具体步骤:

  • 第一步,客户端向服务器发起HTTPS请求,charles截获并伪装成客户端向服务器发送请求。
  • 第二步,charles获取到服务器的CA证书,伪造自己的CA证书冒充服务器证书传递给客户端。
  • 第三步,客户端根据返回的数据进行证书校验、生成Pre_master、用charles伪造的证书公钥加密。
  • 第四步,charles用自己伪造证书的私钥解开,获得对称密钥enc_key。
  • 第五-八步,在之后的正常加密通信过程中,charles始终用对称密钥解密再加密,信息全程透明。

总结:HTTPS抓包的原理是Charles作为"中间人代理",前提是客户端选择信任并安装Charles的CA证书。如果用户没有安装证书,抓包工具将无法解包HTTPS请求,证明了HTTPS在默认配置下可以有效抵抗中间人攻击。安全这个课题,是在攻防中求发展,将攻击的成本提高了,就间接达到了安全的目标。

# 08.Https性能分析

# 8.1 HTTPS性能损耗

  • 增加延时:一次完整的握手至少需要两端依次来回两次通信,至少增加延时2* RTT。利用会话缓存复用连接,延时也至少1* RTT*。
  • 消耗较多的CPU资源:对称加密算法AES-CBC-256 吞吐量 600Mbps,非对称 RSA 私钥解密200次/s。RSA的解密能力是当前困扰HTTPS接入的主要难题。

# 8.2 HTTPS接入优化

  • CDN接入:CDN天然离用户最近,通过和业务服务器维持长连接、会话复用和链路质量优化,极大减少HTTPS带来的延时。
  • 会话缓存:基于会话缓存建立的HTTPS连接不需要服务器使用RSA私钥解密,可以省去CPU的消耗。
  • 硬件加速:为接入服务器安装专用的SSL硬件加速卡,作用类似GPU,释放CPU。
  • 远程解密:将最消耗CPU资源的RSA解密计算任务转移到其它服务器。
  • SPDY/HTTP2:利用TLS/SSL带来的优势,通过修改协议的方法来提升HTTPS的性能。

# 09.TLS协议深度解析

# 9.1 TLS记录协议

TLS协议由两层组成:底层的**记录协议(Record Protocol)**和上层的多个子协议。

TLS协议层次结构:

  ┌──────────┬──────────┬──────────────┬──────────┐
  │ 握手协议  │ 报警协议 │ 密码变更协议  │ 应用数据  │
  ├──────────┴──────────┴──────────────┴──────────┤
  │              TLS记录协议(Record Protocol)     │
  ├───────────────────────────────────────────────┤
  │                    TCP                         │
  └───────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9

TLS记录协议负责将数据分片、压缩、加密、添加MAC(消息认证码),然后交给TCP传输。

TLS记录格式:

+-----+--------+--------+--------------------+
|类型  | 版本   | 长度   |    加密的数据       |
|(1B) | (2B)  | (2B)  |   (≤16384+2048B)  |
+-----+--------+--------+--------------------+
类型:20=ChangeCipher, 21=Alert, 22=Handshake, 23=Application
1
2
3
4
5

# 9.2 TLS握手协议详解

TLS 1.2的完整握手过程(以ECDHE密钥交换为例):

客户端                                          服务端

─── ClientHello ──────────────────────→
    支持的TLS版本列表、密码套件列表、客户端随机数
    
←── ServerHello ──────────────────────
    选择的TLS版本、密码套件、服务端随机数
    
←── Certificate ──────────────────────
    服务器证书链
    
←── ServerKeyExchange ────────────────
    ECDHE参数(椭圆曲线名称+服务端临时公钥),用服务端私钥签名
    
←── ServerHelloDone ──────────────────
    
─── ClientKeyExchange ────────────────→
    客户端临时公钥(ECDHE)
    
    双方各自计算:
    Pre-Master Secret = ECDHE(临时私钥, 对方临时公钥)
    Master Secret = PRF(Pre-Master, Client Random, Server Random)
    密钥块 = PRF(Master Secret, ...) → 拆分为6个密钥
    
─── ChangeCipherSpec ─────────────────→
─── Finished ─────────────────────────→
    
←── ChangeCipherSpec ─────────────────
←── Finished ─────────────────────────
    
    握手完成,开始加密通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 9.3 密钥导出过程

TLS握手中最核心的部分是密钥的导出:

1. Pre-Master Secret:由密钥交换算法产生(ECDHE/RSA)

2. Master Secret(48字节)= PRF(Pre-Master, "master secret", CR+SR)

3. 密钥块 = PRF(Master, "key expansion", SR+CR)

4. 从密钥块中切割出6个密钥:
   ├── client_write_MAC_key / server_write_MAC_key
   ├── client_write_key / server_write_key
   └── client_write_IV / server_write_IV

为什么两个方向使用不同的密钥?
→ 防止"反射攻击":攻击者将客户端发送的消息原封不动发回
1
2
3
4
5
6
7
8
9
10
11
12
13

前向安全(Forward Secrecy):使用 ECDHE/DHE 密钥交换时,即使服务端私钥泄露,过去的会话密钥也无法被解密。因为每个会话的临时私钥是随机生成的,用完即丢弃。

# 9.4 TLS 1.3的改进

TLS 1.3(RFC 8446,2018年发布)是TLS协议的重大升级:

TLS 1.3 vs TLS 1.2 对比:

                    TLS 1.2              TLS 1.3
握手RTT             2-RTT                1-RTT(可0-RTT恢复)
密钥交换            RSA/DHE/ECDHE        仅ECDHE/DHE
对称加密            AES-CBC/AES-GCM      仅AEAD
前向安全            可选                  强制
压缩                支持(已废弃)          移除
重协商              支持                  移除
1
2
3
4
5
6
7
8
9

TLS 1.3的1-RTT握手:客户端在 ClientHello 中直接带上 ECDHE 临时公钥(KeyShare),服务器选择后直接开始加密通信,只需1-RTT。

TLS 1.3废弃的不安全特性:

废弃特性 原因
RSA密钥交换 无前向安全性
CBC模式加密 存在padding oracle攻击
RC4算法 多个已知漏洞
SHA-1签名 碰撞攻击已可行
压缩 CRIME攻击利用压缩泄露信息
重协商 设计复杂,攻击面大

# 10.HTTPS安全攻防

# 10.1 SSL剥离攻击

**SSL剥离(SSL Stripping)**是一种降级攻击:中间人将HTTPS连接降级为HTTP。

攻击场景(对应事故③):
  用户输入 company.com → http://company.com
  → 中间人截获,自己与服务器建立HTTPS连接
  → 中间人与用户之间使用HTTP通信
  
  用户 ←─HTTP─→ 中间人 ←─HTTPS─→ 服务器
  
  用户在咖啡店WiFi上登录 → 密码明文传给中间人 → 账户被盗
1
2
3
4
5
6
7
8

防御手段:

  • HSTS:告诉浏览器以后只用HTTPS访问,阻止降级
  • HSTS Preload:在浏览器中预置HTTPS-only域名列表
  • 用户教育:检查地址栏的锁头图标

# 10.2 降级攻击防护

**降级攻击(Downgrade Attack)**是指攻击者迫使通信双方使用较旧、较弱的协议版本或密码算法。

TLS 1.3的防护措施:

  1. ServerHello的Random字段末尾包含特殊标记,如果协商到TLS 1.2但Random末尾有TLS 1.3标记,说明被降级了
  2. Finished消息包含整个握手的Hash,如果任何握手消息被篡改,Hash不匹配

回到事故⑤:小陈配置了 HSTS max-age=31536000(1年)。一旦浏览器收到这个头,在1年内对该域名只走HTTPS。如果需要回退到HTTP怎么办?只能设置 max-age=0 并通过HTTPS访问一次让浏览器更新策略。更麻烦的是——如果域名在 HSTS Preload List 中,浏览器甚至不会先发 HTTP 请求,直接走 HTTPS。

# 10.3 证书固定(Pinning)

**证书固定(Certificate Pinning)**是客户端内置服务器证书的指纹,不仅验证证书链,还验证证书本身是否符合预期。

客户端内置:预期指纹 = "sha256/AAAAAAA..."
验证时:    实际指纹 = SHA-256(收到的证书公钥)
if (实际指纹 != 预期指纹) → 拒绝连接

即使CA被攻破颁发了虚假证书,由于公钥不同,指纹也不同,客户端会拒绝连接。
1
2
3
4
5

证书固定的使用场景:移动App与自己的后端服务器通信时,可以将证书指纹硬编码在App中。这样即使用户安装了恶意根证书,也无法对App的通信进行中间人攻击。

# 10.4 HPKP的兴衰

HPKP(HTTP Public Key Pinning)是在HTTP头部中声明证书固定的机制,但已被废弃:

  1. 配置错误的风险:如果pin了错误的证书,用户将完全无法访问网站
  2. 证书轮换困难
  3. 可被恶意利用
  4. Chrome 72(2019年)移除了HPKP支持

替代方案:Expect-CT和证书透明度(CT)——通过公开审计来保证证书的合法性。

# 11.HTTPS部署实践

# 11.1 证书申请与管理

证书申请流程:
1. 生成密钥对:openssl genrsa -out server.key 2048
2. 生成CSR:openssl req -new -key server.key -out server.csr
3. 提交CSR给CA(Let's Encrypt等)
4. CA验证域名所有权(DNS/HTTP/邮件验证)
5. CA签发证书
1
2
3
4
5
6

Let's Encrypt自动化:使用ACME协议实现证书的自动申请和续期,配合certbot等工具完全自动化。

# 11.2 服务器配置最佳实践

# Nginx HTTPS配置最佳实践
server {
    listen 443 ssl http2;
    server_name example.com;
    
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
    # 只启用TLS 1.2和1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # 强密码套件
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    
    # OCSP Stapling(提升验证速度)
    ssl_stapling on;
    ssl_stapling_verify on;
    
    # Session复用(提升性能)
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    
    # HSTS(设置合理的max-age,避免事故⑤)
    add_header Strict-Transport-Security "max-age=63072000" always;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 11.3 安全评估与测试

工具 用途 地址
SSL Labs 最权威的HTTPS评估 ssllabs.com/ssltest
testssl.sh 命令行TLS测试工具 github.com/drwetter/testssl.sh
Mozilla SSL Config 生成安全的服务器配置 ssl-config.mozilla.org

SSL Labs评级标准:A+需要TLS 1.2+、强密码套件、HSTS、无已知漏洞。

# 11.4 常见问题排查

1. 证书链不完整 → 部分浏览器显示证书不受信任
   排查:openssl s_client -connect example.com:443 -showcerts

2. 混合内容(Mixed Content)→ 浏览器警告"不安全的内容"
   HTTPS页面中引用了HTTP资源 → 全部使用HTTPS

3. 证书域名不匹配 → 浏览器显示"此连接不安全"
   排查:openssl x509 -in cert.pem -text | grep DNS

4. HSTS导致的访问问题(对应事故⑤)
   症状:设置HSTS后无法回退到HTTP
   排查:chrome://net-internals/#hsts 查看缓存状态
   解决:清除浏览器HSTS缓存,或设置max-age=0
1
2
3
4
5
6
7
8
9
10
11
12
13

# 12.综合案例:从0到1部署生产级HTTPS服务

前面我们分别讲了 HTTPS 的加密原理、CA 信任链、TLS 握手、安全攻防和部署实践。但这些知识如果是孤立地看,很难形成"部署一个安全的 HTTPS 服务"的系统能力。

本章用一个贯穿全文的实战案例——从"HTTP 裸奔"开始,经历四次安全升级,最终达到 SSL Labs A+ 评级。每一站都有具体命令和配置。读完这一节,你应该能形成"部署一个 HTTPS 服务时知道什么该做、什么不该做、每个配置有什么安全后果"的能力。

# 12.1 案例背景与目标

假设我们运营一个公司官网 www.company.com(Nginx 服务器),需要从 HTTP 迁移到 HTTPS 并达到生产级安全标准。

阶段 方案 安全等级 对应事故
第一站 HTTP 裸奔 零安全 ①
第二站 自签名证书 SSL Labs: T(不可信) ②
第三站 Let's Encrypt 免费证书 SSL Labs: B ④
第四站 生产级加固 SSL Labs: A+ ③⑤全部解决

# 12.2 第一站:HTTP裸奔——零安全基线

最初始的状态:

# V1: HTTP only
server {
    listen 80;
    server_name www.company.com;
    
    location / {
        root /var/www/html;
        index index.html;
    }
}
1
2
3
4
5
6
7
8
9
10

安全测试:

# 用 Wireshark 抓包查看HTTP请求
# 在咖啡店WiFi上,任何人都能看到:
GET /api/login?username=admin&password=123456 HTTP/1.1
Host: www.company.com
# 👆 密码明文传输
1
2
3
4
5
V1 安全评估:
  SSL Labs评级:  N/A(没有HTTPS)
  窃听风险:      ❌ 极高(明文传输)
  冒充风险:      ❌ 极高(无身份验证)
  篡改风险:      ❌ 极高(无完整性校验)
  对应事故:      ①(这就是为什么小程序强制HTTPS)
1
2
3
4
5
6

# 12.3 第二站:自签名证书——有加密没信任

# 生成自签名证书
openssl req -x509 -newkey rsa:2048 -keyout self-signed.key \
  -out self-signed.crt -days 365 -nodes \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Company/CN=www.company.com"

# V2 配置
server {
    listen 443 ssl;
    server_name www.company.com;
    
    ssl_certificate /etc/nginx/ssl/self-signed.crt;
    ssl_certificate_key /etc/nginx/ssl/self-signed.key;
    
    # ⚠️ 默认协议版本可能包含不安全的TLS 1.0/1.1
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ← 不安全!
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

测试结果:

# 浏览器访问:红色警告 "NET::ERR_CERT_AUTHORITY_INVALID"
# curl 测试
curl -v https://www.company.com
# * SSL certificate problem: self-signed certificate
1
2
3
4
V2 安全评估:
  SSL Labs评级:  T(不可信——对应事故②)
  加密:          ✅ 数据已加密(不会被明文窃听)
  身份验证:      ❌ 无(任何攻击者都可以自签名伪造相同域名的证书)
  浏览器体验:    ❌ 红色警告,用户不敢访问

为什么自签名证书不安全?
  1. 没有CA信任链:浏览器无法回溯到信任的根CA
  2. 无法防止中间人攻击:攻击者也可以为 company.com 生成自签名证书
  3. 没有证书吊销机制:如果私钥泄露,无法通知浏览器"这个证书已作废"
1
2
3
4
5
6
7
8
9
10

# 12.4 第三站:Let's Encrypt——信任但不完美

# 使用 certbot 自动申请 Let's Encrypt 证书
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d www.company.com

# certbot 自动完成:
# 1. 生成密钥对
# 2. 验证域名所有权(HTTP-01 挑战)
# 3. 获取签发的证书
# 4. 配置 Nginx 并添加 HTTP→HTTPS 重定向
1
2
3
4
5
6
7
8
9

certbot 自动生成的配置:

# V3: Let's Encrypt
server {
    listen 443 ssl;
    server_name www.company.com;
    
    ssl_certificate /etc/letsencrypt/live/www.company.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.company.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
}

# 自动续期(Linux crontab)
# 0 0 * * * certbot renew --quiet
1
2
3
4
5
6
7
8
9
10
11
12

测试结果:

# 浏览器:绿色小锁头 ✓
curl -I https://www.company.com
# HTTP/2 200 ✓

# 但:SSL Labs 评级通常只有 B
# 原因:默认配置可能包含TLS 1.0/1.1、较弱的密码套件
1
2
3
4
5
6
V3 安全评估:
  SSL Labs评级:  B(信任,但不够安全——对应事故④的风险点)
  信任链:        ✅ 有效(Let's Encrypt根证书被所有现代浏览器信任)
  加密:          ✅ 有效
  自动续期:      ⚠️  需要配置 cron,如果cron失败→证书过期→宕机
  
为什么只能拿到B?
  1. 可能启用了TLS 1.0/1.1(有已知漏洞)
  2. 密码套件中可能包含CBC模式(padding oracle攻击风险)
  3. 没有HSTS头,用户仍可能通过HTTP访问→有SSL剥离风险
  4. 没有OCSP Stapling,证书吊销检测较慢
1
2
3
4
5
6
7
8
9
10
11

# 12.5 第四站:生产级加固——A+评级

# V4: 生产级HTTPS配置(目标:SSL Labs A+)
server {
    listen 80;
    server_name www.company.com;
    # 强制HTTP→HTTPS重定向(HSTS的补充)
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.company.com;
    
    # ===== 1. 证书配置 =====
    ssl_certificate /etc/letsencrypt/live/www.company.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.company.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/www.company.com/chain.pem;
    
    # ===== 2. 协议版本(事故③⑤的防护)=====
    # 只启用TLS 1.2和1.3,禁用所有旧版本
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # ===== 3. 密码套件 =====
    # 仅使用AEAD加密(GCM/ChaCha20),具备认证加密能力
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    
    # ===== 4. ECDH参数 =====
    ssl_ecdh_curve secp384r1;  # 比P-256稍慢但安全性更高
    
    # ===== 5. OCSP Stapling(性能+安全)=====
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    
    # ===== 6. Session复用(性能)=====
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;  # 关闭ticket以保证前向安全
    # (TLS 1.3下session tickets自动使用前向安全的密钥,但关闭更安全)
    
    # ===== 7. HSTS(事故③的防护,事故⑤的警示)=====
    # max-age从1年改为2年(STScrict-Transport-Security标准推荐)
    # 注意:配置前先确认所有子域名都支持HTTPS!
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
    # ===== 8. 安全头部 =====
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
    # ===== 9. 内容安全 =====
    # 确保所有资源都走HTTPS(防止混合内容警告)
    add_header Content-Security-Policy "upgrade-insecure-requests" always;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

自动续期 + 监控配置:

# 1. 确保 certbot 自动续期
# /etc/cron.d/certbot
0 0,12 * * * root certbot renew --quiet --post-hook "nginx -s reload"

# 2. 证书过期监控脚本(防止事故④)
#!/bin/bash
# check_cert_expiry.sh
DAYS_LEFT=$(echo | openssl s_client -servername www.company.com \
  -connect www.company.com:443 2>/dev/null | \
  openssl x509 -noout -enddate | \
  sed 's/.*=//' | xargs -I{} sh -c 'echo $(( ($(date -d "{}" +%s) - $(date +%s)) / 86400 ))')

if [ $DAYS_LEFT -lt 14 ]; then
  echo "⚠️ SSL证书将在 $DAYS_LEFT 天后过期!" | \
    mail -s "SSL证书过期告警" admin@company.com
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

测试结果:

# SSL Labs 测试
curl https://www.ssllabs.com/ssltest/analyze.html?d=www.company.com

# 结果:A+
# ✅ TLS 1.3 + TLS 1.2
# ✅ 前向安全(ECDHE)
# ✅ HSTS with long max-age
# ✅ OCSP Stapling
# ✅ 无已知漏洞
# ✅ 强密码套件
# ✅ 证书链完整

# 速度测试
curl -w "TCP握手: %{time_connect}s\nTLS握手: %{time_appconnect}s\n" \
  -o /dev/null -s https://www.company.com
# TCP握手: 0.030s
# TLS握手: 0.060s (含验证+密钥协商)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
V4 安全评估:
  SSL Labs评级:  A+ ✨
  信任链:        ✅ Let's Encrypt
  前向安全:      ✅ ECDHE密钥交换
  防SSL剥离:     ✅ HSTS + HTTP→HTTPS重定向
  防降级攻击:    ✅ 仅TLS 1.2/1.3
  证书自动续期:  ✅ certbot cron + 到期监控
  协议版本:      TLS 1.2 + TLS 1.3
  密码套件:      仅AEAD (AES-GCM)
  对应事故:      全部解决
1
2
3
4
5
6
7
8
9
10

# 12.6 四种方案横向对比

维度 V1 HTTP裸奔 V2 自签名 V3 Let's Encrypt V4 生产级
传输加密 ❌ 明文 ✅ RSA/ECDHE ✅ RSA/ECDHE ✅ ECDHE
身份验证 ❌ ❌ ✅ CA信任链 ✅
数据完整性 ❌ ✅ MAC ✅ AEAD ✅ AEAD
SSL Labs评级 N/A T(不可信) B A+
浏览器体验 无锁 红色警告 绿色锁 绿色锁
前向安全 — ❌ ○(部分) ✅
HSTS ❌ ❌ ❌ ✅
自动续期 — ❌ ✅ (cron) ✅ (cron+监控)
OCSP Stapling — ❌ ❌ ✅
TLS 1.0/1.1 — ○(可能) ○(可能) ❌ (禁用)
对应事故 ① ② ④ 全部解决
对应章节 2.1 5.1 11.1 10.2/11.2
安全等级进化:

  SSL Labs评级
  │
  │ A+ ████  V4(生产级)
  │ B   ████  V3(Let's Encrypt)
  │ T   ████  V2(自签名)
  │ N/A ████  V1(HTTP)
  └────────────────→ 安全等级

关键跃升:
  V1→V2:有了加密,但没有信任(自签名的密码学悖论)
  V2→V3:有了信任,但配置不够安全(CA证书的重要性)
  V3→V4:信任+安全+性能三位一体(从能用→生产级)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 12.7 案例升华:HTTPS的攻防哲学

经历了四次升级,回头看 HTTPS 的设计哲学就豁然开朗了:

HTTPS 的三层防护体系:

第一层:加密(保密性)
  对称加密(AES-GCM) → 保护数据内容不被窃听
  对应事故:任何在公共WiFi上传输的密码如果不加密→明文暴露

第二层:身份验证(认证性)
  数字证书 + CA信任链 → 确保你在和真正的服务器通信
  对应事故②:自签名证书没有CA背书→中间人可以伪造
  对应事故③:即使有加密,如果攻击者冒充服务器→数据仍泄露

第三层:完整性校验(防篡改)
  AEAD(认证加密)→ 数据被篡改立刻可发现
  即使中间人截获了密文,修改任何一位都会导致MAC验证失败

HTTPS 的"不防"清单(常见误区):
  ✗ 不防DNS劫持(DNS层面攻击→需DNSSEC)
  ✗ 不防恶意CA颁发虚假证书(CA被攻破→需证书透明度CT)
  ✗ 不防用户安装了恶意根证书(Charles抓包原理→需证书固定)
  ✗ 不防应用层漏洞(SQL注入、XSS跟HTTPS无关)
  ✗ 不防用户访问了钓鱼域名(类似域名+LV证书)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 12.8 全文知识图谱回顾

                    小陈的五类事故
                    │
    ┌───────┬───────┼───────┬───────┐
    │       │       │       │       │
   ①HTTP   ②自签名  ③剥离   ④过期   ⑤HSTS
    │       │       │       │       │
    ▼       ▼       ▼       ▼       ▼
 HTTP风险  CA信任  SSL剥离  证书管理  HSTS
 明文传输  信任链   降级攻击  自动续期  max-age
 [2.1]   [5.1]   [10.1]  [11.1]  [10.2]
    │       │       │       │       │
    └───────┴───────┼───────┴───────┘
                    │
        ┌───────────┴───────────┐
        │                       │
  TLS握手 [9章]           安全攻防 [10章]
  密钥协商+RTT            证书固定+HPKP
        │                       │
        └───────────┬───────────┘
                    │
   V1→V2→V3→V4  HTTPS部署的四次进化
     [第12章]     N/A→T→B→A+
                    │
                    ▼
     加密 + 身份验证 + 完整性校验
       HTTPS的三层防护体系 [12.7节]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

最终的方法论沉淀——部署 HTTPS 时,都应该问自己三个问题:

  1. 加密够不够强?(协议版本够新吗?密码套件安全吗?有没有前向安全?)
  2. 证书有没有人管?(过期前多久告警?续期自动化了吗?私钥泄露了怎么办?)
  3. 降级防住了吗?(HSTS配了吗?max-age合理吗?HTTP重定向了吗?)

把这三个问题问到位,你就从"装个证书"进化到了"懂HTTPS安全部署的工程师"。

# 13.思考题与作业

# 13.1 基础思考题

  1. HTTP的三大风险:窃听、篡改、冒充。HTTPS分别用什么机制应对?请一一对应说明。

  2. 对称加密 vs 非对称加密:为什么HTTPS不全程使用非对称加密,而只在握手阶段使用?全程非对称加密有什么问题?全程对称加密又有什么问题?

  3. 证书链的信任传递:浏览器如何验证 server.crt 是否合法?写出从服务器证书回溯到根证书的完整验证步骤。如果中间证书没有发给客户端,会发生什么?

  4. TLS 1.2 vs TLS 1.3:TLS 1.3 握手的 RTT 从2降到1,具体省掉了哪个步骤?为什么这个步骤可以被省掉?

# 13.2 进阶思考题

  1. 事故③的深度复盘:SSL剥离攻击的受害者看到的页面和真正的HTTPS页面有什么不同?普通用户能发现吗?除了HSTS,还有哪些方法可以防范SSL剥离攻击?(提示:浏览器UI优化、HTTPS Everywhere、CSP upgrade-insecure-requests)

  2. 自签名证书真的毫无用处吗?:自签名证书在什么场景下是合理甚至是必要的?为什么内网环境经常使用自签名证书?内网使用自签名证书的安全底线是什么?

  3. 证书透明度的设计智慧:CA被攻破后可能为任意域名签发证书。CT(Certificate Transparency)日志如何解决这个问题?为什么说CT是对PKI体系"信任但验证"的体现?

  4. 前向安全的代价:ECDHE提供前向安全(即使服务器私钥泄露,历史会话仍安全),但缺点是什么?为什么某些CDN或网关设备不支持ECDHE?为什么RSA密钥交换仍然被广泛使用?

# 13.3 动手作业

作业一(必做):用 openssl 模拟完整的 TLS 握手过程。

# 1. 查看服务器证书详情
openssl s_client -connect www.baidu.com:443 -showcerts

# 2. 查看证书信息
echo | openssl s_client -connect www.baidu.com:443 2>/dev/null | \
  openssl x509 -noout -text | grep -E "Subject:|Issuer:|Not Before|Not After|DNS:"

# 3. 测试不同TLS版本
openssl s_client -connect www.baidu.com:443 -tls1_2
openssl s_client -connect www.baidu.com:443 -tls1_3
1
2
3
4
5
6
7
8
9
10
  • 记录证书的 Subject、Issuer、有效期、支持的TLS版本。
  • 画出证书链:从服务器证书→中间CA→根CA。

作业二(选做):部署自己的HTTPS站点。

  • 用 Docker 启动一个 Nginx 容器,配置一个自签名证书,访问观察浏览器警告。
  • 用 Let's Encrypt + certbot 申请免费证书,替换自签名证书。
  • 对比两种方案下 SSL Labs 的评级差异。
  • 尝试将评级从 B 优化到 A+:禁用TLS 1.0/1.1、启用HSTS、配置OCSP Stapling。
阶段 SSL Labs评级 关键改进
自签名
Let's Encrypt默认
加固后

作业三(架构思考):检查你的项目HTTPS配置。

  • 用 testssl.sh 或 SSL Labs 扫描你负责的线上服务。
  • 记录当前评级和发现的问题。
  • 写出优化方案,包括:协议版本升级、密码套件精简、HSTS配置、证书管理策略。
上次更新: 2026/06/09, 15:47:57
HTTP协议设计思想
HTTP连接和跳转

← HTTP协议设计思想 HTTP连接和跳转→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式