HTTPS加密与证书完全指南(中)

1. 证书链详解

实际使用中,证书不是直接由根CA签发,而是通过中间CA签发。

证书链

根CA证书
离线保存
自签名

中间CA证书
在线签发
由根CA签名

服务器证书
部署在服务器
由中间CA签名

服务器 客户端 服务器 客户端 客户端本地有预装的根CA证书 步骤1:验证服务器证书 用中间CA证书验证服务器证书的签名 验证通过 ✓ 步骤2:验证中间CA证书 用根CA证书验证中间CA证书的签名 验证通过 ✓ 信任链完整,连接建立 发送证书链[服务器证书+中间CA证书]

形象类比: 证书链 = 公务员任命体系

  • 根CA = 国家主席(最高权力,自己任命自己)
  • 中间CA = 省长(由国家主席任命)
  • 服务器证书 = 县长(由省长任命)

你认识县长,但不认识省长和国家主席?
没关系,往上查:县长→省长→国家主席,一路追溯到你认识的人

为什么需要中间CA?

  • 根CA私钥必须离线保存(物理隔离)
  • 中间CA可以在线签发证书
  • 根CA泄露=整个信任体系崩塌,中间CA泄露=只影响它签发的证书

2. 证书吊销机制

证书在有效期内可能出问题(私钥泄露、公司倒闭等),需要提前作废。

2.1 CRL(证书吊销列表)

在列表中

不在列表中

CA维护吊销列表

定期发布CRL文件

客户端下载CRL

检查证书是否在列表中

拒绝连接

继续验证

形象类比: CRL = 银行挂失名单

银行定期把挂失的银行卡号发给各网点,你拿挂失卡去取钱,网点一查名单就知道不能用

缺点: 列表可能很大,更新不及时

2.2 OCSP(在线证书状态协议)

OCSP服务器 服务器 客户端 OCSP服务器 服务器 客户端 请求连接 发送证书 查询证书状态(实时) 返回状态(good/revoked/unknown) 继续或拒绝

形象类比: OCSP = 实时查询银行客服

不用等挂失名单寄到,直接打电话问"这张卡还能用吗?"

优点: 实时性好
缺点: 增加一次网络请求,有隐私泄露风险

2.3 OCSP Stapling(装订)

OCSP服务器 服务器 客户端 OCSP服务器 服务器 客户端 缓存OCSP响应 无需单独查询OCSP 定期查询证书状态 返回签名的OCSP响应 请求连接 发送证书 + OCSP响应(一起发)

形象类比: OCSP Stapling = 快递员帮你查

你不用自己去查包裹状态,快递员定期查好,送包裹时直接告诉你

最佳实践: 服务器开启OCSP Stapling,兼顾实时性和性能

3. 证书透明度(CT)

CT(Certificate Transparency)是防止CA伪造证书的监控机制。

监控机制

公开的日志

任何人都可以监控

发现可疑证书可报警

CT工作流程

CA签发证书

提交到CT日志服务器

日志服务器返回SCT签名

证书中包含SCT

浏览器验证SCT

形象类比: CT = 公示栏

公安局发的每张身份证都要在公示栏贴出来,大家都看到了,就没法偷偷给人发假证了

作用:

  • 所有证书签发都留记录
  • 任何人都可以监控是否有可疑证书
  • CA无法偷偷签发恶意证书

4. HSTS(HTTP严格传输安全)

HSTS告诉浏览器:这个网站只能用HTTPS访问,不要用HTTP。

首次访问example.com

服务器返回HSTS头

浏览器记住:只能用HTTPS

下次访问时自动用HTTPS

即使输入http://也自动转https://

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)在此基础上让服务器也验证客户端身份,实现双向身份确认。

服务器 客户端 服务器 客户端 阶段一:客户端验证服务器(同普通 HTTPS) 验证服务器证书 阶段二:服务器验证客户端(mTLS 特有) 验证客户端证书的 CA 签名 协商密钥并加密通信 Client Hello Server Hello + 服务器证书 CertificateRequest(索要客户端证书) 客户端证书(client.crt) Finished Finished

形象类比: 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.crtclient.key

curl --cert client.crt --key client.key \
     --cacert ca.crt https://api.example.com

7. 前向保密(PFS)

即使服务器私钥泄露,历史通信也无法被解密。

没有PFS

服务器私钥泄露

攻击者解密所有历史流量

所有通信内容暴露

有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)
  • 定期更新服务器软件
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐