你在项目里更常遇到的是这些问题:
- 浏览器突然提示"证书不受信任/域名不匹配/已过期"
- 线上接口偶发失败,但服务端日志没什么异常(有时其实卡在握手/协商)
- 你明明用了 HTTPS,为什么还能被劫持跳广告?
- 面试问 TLS 握手,你能说流程,但解释不清"每一步在解决什么"
HTTPS/TLS 的关键不是把流程背下来,而是要能回答:
- 它要防什么(窃听/篡改/冒充)
- 它靠什么做到(证书身份 + 密钥协商 + 完整性校验)
- 出了问题怎么证据化定位(用 openssl/curl/浏览器安全面板)
目录(按排查顺序)
-
- HTTPS 到底比 HTTP 多了什么
-
- TLS 握手要解决的 3 件事(你是谁/用什么密钥/数据没被改)
-
- 握手关键动作(不死背字段,但要讲清逻辑)
-
- 证书链验证:浏览器到底在信什么
-
- 证书、CA、链式验证
-
- 实战:如何验证证书/协议版本/加密套件,如何定位握手失败
-
- 最后总结
1. 一句话回答:HTTPS 是什么
- HTTPS = HTTP + TLS
- TLS 负责:
- 身份认证(证书)
- 加密传输
- 数据完整性校验
所以 HTTPS 的目标不是"更快",而是:
- 防窃听
- 防篡改
- 防冒充
2. 为什么不能只用对称加密
对称加密(AES 等)很快,但有个关键难题:
- 密钥怎么安全分发?
如果你把对称密钥明文发给对方:
- 中间人就能拿到
- 之后照样能解密
所以 TLS 需要结合:
- 非对称加密(用于安全协商密钥)
- 对称加密(用于后续高性能数据传输)
3. TLS 握手解决的 3 个核心问题
你可以用"面试三连"回答:
- 你是谁:服务端身份认证(证书 + CA)
- 用什么密钥:协商出对称加密密钥(会话密钥)
- 数据没被改:完整性校验(MAC/AEAD)
4. TLS 握手流程(以常见版本为例)
不同 TLS 版本细节不同,但面试一般不要求你逐报文背所有字段。
你只要把"核心动作"讲清楚:
4.1 ClientHello
客户端发起:
- 支持的 TLS 版本
- 支持的加密套件(cipher suites)
- 随机数(client random)
4.2 ServerHello + 证书
服务端返回:
- 选择的 TLS 版本与加密套件
- 随机数(server random)
- 服务端证书(含公钥)
4.3 客户端验证证书
客户端会验证:
- 证书是否过期
- 域名是否匹配
- 是否由可信 CA 签发
- 证书链是否完整
4.4 协商会话密钥
常见方式(面试表达即可):
- 早期:RSA 交换
- 现在更推荐:ECDHE(前向安全)
目标:
- 双方最终计算出同一个对称会话密钥
4.5 Finished:切换到加密通信
握手完成后:
- 后续 HTTP 数据用对称加密传输
5. 证书、CA、链式验证
为什么要证书?
- 因为你不能只相信"我说我是某某网站"
证书的作用:
- 把"域名/主体信息"与"公钥"绑定
- 并由 CA 用私钥签名
浏览器为什么能验证?
- 浏览器/系统内置了一批可信 CA 根证书
- 通过证书链,一层层验证签名
面试加分点:
- 证书只是证明公钥是谁的,不负责加密数据本身。
6. 实战:如何验证证书/协议版本/加密套件,如何定位握手失败
6.1 用浏览器快速确认:证书是谁签的、是否匹配域名
- Chrome -> 点击地址栏小锁 -> 证书(Certificate)
- 重点看:
- 证书是否过期
- 证书的 SAN(Subject Alternative Name)里有没有当前域名
- 证书链是否完整、根证书是否受信任
6.2 用 openssl 把握手细节"证据化"
bash
openssl s_client -connect example.com:443 -servername example.com
你通常关注:
- 证书链(有没有中间证书)
- 协议版本(TLS1.2 / TLS1.3)
- cipher suite(加密套件)
6.3 用 curl 看一次请求里 TLS + HTTP 的组合表现
bash
curl -v https://example.com/
你能看到:
- 是否发生了证书校验错误
- ALPN 协商结果(可能协商出 h2)
- HTTP 状态码与响应头
6.4 常见"握手失败/证书报错"快速定位方向
- 证书过期/域名不匹配:证书本身问题(更新证书/检查 CDN 回源域名)
- 证书链不完整:服务端没下发中间证书(很多 Java/网关配置会踩坑)
- 协议/套件不兼容:老客户端不支持 TLS1.3/某些套件,或服务端禁用了旧版本
- 中间人/代理:公司代理/抓包工具会做"中间人证书",客户端不信任就会报错
7. 最后总结
7.1 什么是中间人攻击,TLS 怎么防?
- 中间人想冒充服务端,把自己的公钥发给你。
- 但它没有权威 CA 的签名证书(或证书链无法验证)。
所以浏览器会:
- 验证证书链
- 验证域名
验证失败就提示风险。
7.2 什么是前向安全(Forward Secrecy)
- 使用 ECDHE 等临时密钥交换方式。
- 即使服务端长期私钥泄露,历史会话密钥也不会被还原。
7.3 你可以这样总结(写在脑子里的版本)
HTTPS = HTTP + TLS。TLS 握手阶段核心解决三件事:确认服务端身份(证书链验证)、协商出会话密钥(通常 ECDHE)、保证握手过程与后续数据的完整性。握手结束后,HTTP 数据用对称加密传输保证性能;证书/CA 体系用来防止中间人冒充,ECDHE 提供前向安全。