HTTPS-TLS加密与证书完全指南(中)
HTTPS加密与证书完全指南(中)
1. 证书链详解
实际使用中,证书不是直接由根CA签发,而是通过中间CA签发。
形象类比: 证书链 = 公务员任命体系
- 根CA = 国家主席(最高权力,自己任命自己)
- 中间CA = 省长(由国家主席任命)
- 服务器证书 = 县长(由省长任命)
你认识县长,但不认识省长和国家主席?
没关系,往上查:县长→省长→国家主席,一路追溯到你认识的人
为什么需要中间CA?
- 根CA私钥必须离线保存(物理隔离)
- 中间CA可以在线签发证书
- 根CA泄露=整个信任体系崩塌,中间CA泄露=只影响它签发的证书
2. 证书吊销机制
证书在有效期内可能出问题(私钥泄露、公司倒闭等),需要提前作废。
2.1 CRL(证书吊销列表)
形象类比: CRL = 银行挂失名单
银行定期把挂失的银行卡号发给各网点,你拿挂失卡去取钱,网点一查名单就知道不能用
缺点: 列表可能很大,更新不及时
2.2 OCSP(在线证书状态协议)
形象类比: OCSP = 实时查询银行客服
不用等挂失名单寄到,直接打电话问"这张卡还能用吗?"
优点: 实时性好
缺点: 增加一次网络请求,有隐私泄露风险
2.3 OCSP Stapling(装订)
形象类比: OCSP Stapling = 快递员帮你查
你不用自己去查包裹状态,快递员定期查好,送包裹时直接告诉你
最佳实践: 服务器开启OCSP Stapling,兼顾实时性和性能
3. 证书透明度(CT)
CT(Certificate Transparency)是防止CA伪造证书的监控机制。
形象类比: CT = 公示栏
公安局发的每张身份证都要在公示栏贴出来,大家都看到了,就没法偷偷给人发假证了
作用:
- 所有证书签发都留记录
- 任何人都可以监控是否有可疑证书
- CA无法偷偷签发恶意证书
4. HSTS(HTTP严格传输安全)
HSTS告诉浏览器:这个网站只能用HTTPS访问,不要用HTTP。
HSTS响应头:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
| 指令 | 作用 |
|---|---|
| max-age | 浏览器记住的时间(秒) |
| includeSubDomains | 包含所有子域名 |
| preload | 提交到浏览器预加载列表 |
形象类比: HSTS = 门卫只认VIP卡
第一次进门后,门卫记住"这个人以后只能刷VIP卡进,不能走普通通道"
即使有人冒充普通访客,门卫也不让进
防什么?
- SSL剥离攻击(把HTTPS降级为HTTP)
- 中间人攻击
5. 证书固定(Certificate Pinning)
客户端只信任特定的证书,不信任其他CA签发的证书。
形象类比: 证书固定 = 公司门禁只认工牌
不管你说你是谁,我只认这张特定的工牌
即使有人伪造了一张"看起来一样"的工牌,门禁也能识别
应用场景:
- 银行APP(防止伪造银行服务器)
- 企业内部应用
- 高安全要求的服务
缺点: 证书轮换困难,需要发新版APP
6. 双向 TLS 认证(mTLS)
普通 HTTPS 只验证服务器身份(“我是真正的服务器”)。mTLS(mutual TLS)在此基础上让服务器也验证客户端身份,实现双向身份确认。
形象类比: mTLS = 进出国安全门
- 普通 HTTPS = 进小区:保安只查你有没有访客身份(验证服务器)
- mTLS = 进出实验室:保安既要确认你是合法员工,你也要确认保安是真的,双向查验工作证
与单向 TLS 的对比:
| 维度 | 单向 TLS(HTTPS) | mTLS |
|---|---|---|
| 谁有证书 | 仅服务器 | 服务器 + 客户端 |
| 谁验证谁 | 客户端验证服务器 | 双向互相验证 |
| 客户端身份 | 无保证(任何人可连) | 凭证书才能连 |
| 适用场景 | 公开网站 | 内部服务 API、服务网格、零信任网络 |
典型应用场景:
- 微服务之间的内部调用(Istio、Linkerd 等服务网格默认开启 mTLS)
- 企业 API 网关(只允许持有客户端证书的应用访问)
- 云手机/物联网设备回连控制端
Nginx 开启 mTLS(示例):
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;
# 关键:开启客户端证书验证,并指定信任的客户端 CA
ssl_client_certificate /etc/ssl/client-ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
}
客户端发起请求时需带上 client.crt 与 client.key:
curl --cert client.crt --key client.key \
--cacert ca.crt https://api.example.com
7. 前向保密(PFS)
即使服务器私钥泄露,历史通信也无法被解密。
形象类比: PFS = 用完即焚的密码本
- 没有PFS:所有通信用同一个密码本,偷到就能解密所有历史
- 有PFS:每次通信用完密码本就烧掉,即使偷到现在的密码本,以前的也解不了
实现方式: 使用ECDHE(椭圆曲线Diffie-Hellman临时密钥交换)
TLS 1.3强制使用PFS,TLS 1.2可选
8. 常见TLS攻击
8.1 BEAST(浏览器漏洞攻击)
| 项目 | 说明 |
|---|---|
| 攻击方式 | 利用TLS 1.0的CBC模式漏洞 |
| 影响 | 可窃取Cookie等敏感数据 |
| 修复 | 升级到TLS 1.2+,使用AEAD加密套件 |
8.2 POODLE(降级攻击)
| 项目 | 说明 |
|---|---|
| 攻击方式 | 强制浏览器降级到SSL 3.0 |
| 影响 | 可窃取加密数据 |
| 修复 | 禁用SSL 3.0,只允许TLS 1.2+ |
8.3 Heartbleed(心脏出血)
| 项目 | 说明 |
|---|---|
| 攻击方式 | OpenSSL的缓冲区溢出漏洞 |
| 影响 | 可读取服务器内存中的敏感数据(私钥、密码) |
| 修复 | 升级OpenSSL版本 |
8.4 降级攻击
| 项目 | 说明 |
|---|---|
| 攻击方式 | 中间人篡改握手消息,强制使用弱加密 |
| 影响 | 使用可被破解的加密算法 |
| 修复 | 服务器只接受强加密套件,启用HSTS |
安全建议:
- 始终使用TLS 1.2+
- 禁用SSL 2.0/3.0和TLS 1.0/1.1
- 只使用AEAD加密套件(AES-GCM、ChaCha20)
- 定期更新服务器软件
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)