CA 证书签发流程与工作流

面试回答: HTTPS 证书签发的核心,是让受信任的 CA 在验证申请者确实控制目标域名后,用 CA 私钥为“域名、公钥、有效期和用途”等证书内容签名。

常见流程可以概括为:服务器本地生成密钥对和 CSR → 向 CA 申请证书 → CA 完成域名控制验证 → CA 签发叶子证书 → 服务器部署叶子证书、私钥和中间证书链 → 到期前续签并替换。

CA 不会拿到服务器私钥;CSR 只包含公钥、申请信息以及由服务器私钥生成的签名。浏览器信任证书,也不只是因为“证书有签名”,而是因为签名能沿证书链验证到本地信任库中的根 CA。

记忆链路:生成密钥 → 提交 CSR → 验证控制权 → CA 签名 → 部署证书链 → 监控与续期。

1. 参与者和产物

以为 www.example.com 申请公开可信的 HTTPS 证书为例:

角色或产物作用是否需要保密
域名申请者证明自己控制目标域名并部署证书
CA验证申请资格并签发证书CA 私钥必须保密
RA代 CA 执行身份或控制权审核;可能与 CA 是同一系统审核凭据需要保护
服务器私钥证明服务器持有证书中公钥对应的私钥必须保密,不能提交给 CA
CSR携带公钥和申请信息,并由服务器私钥签名通常可以公开
叶子证书将域名、服务器公钥、有效期和用途绑定起来可以公开
中间 CA 证书把叶子证书连接到受信任根 CA可以公开
根 CA 证书信任链的锚点,通常预置在客户端信任库证书公开,根 CA 私钥严格离线保护

CSR 是 Certificate Signing Request,即证书签名请求;RA 是 Registration Authority,即注册机构。

2. 完整签发流程

2.1 在服务器侧生成密钥对

申请者首先生成服务器密钥对:

服务器私钥:留在服务器或密钥管理系统中
服务器公钥:写入 CSR,签发后进入叶子证书

私钥应在可信环境中生成和保存。生产环境可以使用 KMS 或 HSM 限制私钥导出。CA 需要的是公钥,不需要也不应该接收服务器私钥。

2.2 创建并提交 CSR

CSR 通常包含:

  • 服务器公钥;
  • 申请者填写的主体信息;
  • 需要写入证书的扩展请求,例如 Subject Alternative Name(SAN);
  • 申请者使用服务器私钥生成的 CSR 签名。

CA 可以用 CSR 中的公钥验证 CSR 签名,从而确认申请者持有对应私钥,并确认请求内容在传输后没有被修改。

但 CSR 签名只证明“申请者持有这把私钥”,不能证明“申请者控制 www.example.com”。域名控制权必须单独验证。

2.3 CA 验证申请资格

这一步的核心作用是:确认申请者确实有权让这张证书代表目标域名

申请者在 CSR 上的签名只能证明“申请者持有与 CSR 中公钥对应的私钥”,不能证明“申请者控制 www.example.com”。任何人都可以生成自己的密钥对,并在 CSR 中填写别人的域名。如果 CA 只验证 CSR 签名就签发证书,攻击者便可能为他人的域名取得受浏览器信任的证书,进而冒充该网站。

因此,CA 必须再通过网站、DNS 或 TLS 服务发起一次只有域名控制者通常才能完成的挑战。两种验证解决的问题不同:

CSR 签名验证:你是否持有这把服务器私钥?
CA 资格验证:你是否有权让这把公钥代表这个域名?

公开 HTTPS 证书最常见的是 DV,即 Domain Validation(域名验证)证书。CA 通常通过以下挑战之一验证域名控制权:

验证方式申请者要做什么常见场景
HTTP-01在指定 HTTP 路径提供一次性验证内容单个可公开访问的网站
DNS-01在指定域名下创建带随机值的 TXT 记录泛域名证书、自动化、多服务器环境
TLS-ALPN-01在 443 端口通过特殊 TLS 握手提供验证信息能直接控制 TLS 服务的环境

挑战值通常是一次性的随机内容,防止其他人复用旧结果。CA 会从外部访问对应位置,确认申请者能够完成挑战。

不同证书类型的审核范围不同:

  • DV:主要验证域名控制权;
  • OV:除域名控制权外,还会审核组织身份;
  • EV:按照更严格的规则审核法律实体和申请授权。

这三类证书都能建立加密的 TLS 通道。更严格的审核表示证书中的组织身份经过更多核验,不代表网站代码一定安全。

2.4 CA 构造并签名证书

验证通过后,CA 会根据 CSR 和自身策略生成证书内容,典型字段包括:

SAN:www.example.com
Public Key:申请者提交的服务器公钥
Issuer:签发该证书的中间 CA
Validity:生效时间与过期时间
Key Usage / Extended Key Usage:允许用于 TLS 服务器认证
Serial Number:CA 分配的唯一序列号

CA 通常使用中间 CA 私钥对叶子证书的待签名部分生成数字签名,而不是直接频繁使用根 CA 私钥。根 CA 私钥可以离线严密保存,只用于签发或更新中间 CA 证书,从而缩小根密钥暴露的风险。

签名完成后,任何人都可以用中间 CA 证书中的公钥验证:

  1. 证书内容在签发后没有被修改;
  2. 签名者持有对应的中间 CA 私钥。

2.5 返回并部署证书链

CA 向申请者返回叶子证书,并提供需要部署的中间 CA 证书。服务器通常配置:

服务器私钥
叶子证书:www.example.com
中间 CA 证书:一个或多个

TLS 握手时,服务器发送叶子证书和必要的中间证书。服务器通常不发送根证书,因为根证书是否可信,应由浏览器或操作系统的本地信任库决定。

浏览器会检查:

  • 访问域名是否匹配证书 SAN;
  • 当前时间是否在证书有效期内;
  • 证书用途是否允许 TLS 服务器认证;
  • 每一级签名能否连接到本地信任的根 CA;
  • 证书是否已被撤销,或服务器是否提供了可接受的状态信息;
  • TLS 握手签名是否证明服务器实际持有叶子证书对应的私钥。

缺少中间证书是常见部署错误。即使叶子证书本身正确,一部分客户端也可能无法构建完整信任链。

2.6 本地信任库是如何建立的?

本地信任库本质上是一组被客户端预先认可的根 CA 证书。它不是浏览器在访问网站时自动学习出来的,而是由操作系统、浏览器、运行环境或组织管理员提前建立并持续维护。

对于公开可信的根 CA,通常会经历以下过程:

根 CA 申请加入根证书计划

操作系统或浏览器厂商审核

CA 接受独立审计并持续满足安全与合规要求

根证书被加入受信任列表

通过系统或浏览器更新分发到用户设备

Microsoft、Apple、Mozilla、Google 等厂商维护各自的根证书计划。申请加入的 CA 通常需要证明自己能够安全保护根私钥、按照规定验证证书申请者、发布证书状态或撤销信息,并接受持续审计和事故披露要求。

本地信任库中的根证书主要有三种来源:

来源如何进入信任库典型用途
系统或浏览器预置根 CA 通过厂商的根证书计划审核,再随软件更新分发公网 HTTPS 网站
组织管理员安装通过设备管理、组策略等方式下发内部根证书企业或学校内部系统
用户手动安装用户主动导入根证书本地开发、测试或特殊内部环境

操作系统、浏览器和运行环境不一定使用同一套信任库。例如,某些浏览器使用操作系统提供的信任机制,某些浏览器维护自己的根证书集合;Java 等运行环境也可能拥有独立的信任库。因此,同一张证书可能在一个客户端中可信,在另一个客户端中不可信。

企业内部 CA 的工作方式相同:管理员把内部根证书安全地下发到受管设备后,这些设备便可以信任由内部 CA 签发的证书;没有安装该根证书的外部设备不会自动信任它们。

手动安装根证书需要非常谨慎。安装一个根证书相当于授权该 CA 为域名签发本机信任的证书。如果对应根私钥或签发系统被滥用,攻击者可能伪造网站身份。

信任也不是永久不变的。如果 CA 违反规则、私钥泄露或不再满足安全要求,信任库维护方可以限制其用途、停止信任其新签发的证书,或者通过软件更新移除对应根证书。

所以,浏览器接受一条证书链的最终依据是:

叶子证书和中间证书的签名逐级验证成功
        +
验证路径最终到达本地信任库中的信任锚
        +
域名、有效期、用途等检查全部通过

服务器即使发送了一张自称为“根 CA”的证书,也不能自行获得信任。根证书必须已经通过可信的软件分发、组织管理或用户授权进入客户端的本地信任库。

3. ACME 自动签发工作流

手工生成 CSR、复制挑战值和替换证书容易出错。ACME(Automatic Certificate Management Environment)把申请、验证、签发和续期标准化,Let's Encrypt 等 CA 支持这一协议。

一次典型自动化工作流如下:

1. ACME 客户端创建账户密钥并向 CA 注册
2. 客户端为一个或多个域名创建证书订单
3. CA 返回每个域名可用的验证挑战
4. 客户端自动配置 HTTP、DNS 或 TLS-ALPN 挑战
5. CA 从外部验证挑战并把授权标记为有效
6. 客户端生成或复用服务器密钥,提交 CSR 完成订单
7. CA 签发证书,客户端下载并部署证书链
8. 客户端在到期前自动续签,成功后平滑重载服务

这里有两类不同的密钥,不要混淆:

  • ACME 账户密钥:证明后续 ACME 请求来自同一个账户;
  • 服务器证书私钥:与叶子证书中的公钥配对,在 TLS 握手中证明服务器身份。

泛域名证书为什么常用 DNS-01?

假设要申请:

*.example.com

CA 无法逐一预测和访问未来出现的所有子域名,因此通常要求通过 DNS-01 在 _acme-challenge.example.com 下发布指定 TXT 记录。能修改父域名 DNS 记录,是控制该命名空间的有力证明。

自动化 DNS-01 时,应把 DNS API 凭据限制到最小权限和最小域名范围,避免证书客户端被攻破后拥有修改整个 DNS 区域的权限。

4. 续期、替换与撤销

签发完成并不代表证书生命周期管理结束。

自动续期

证书有明确有效期,应在到期前提前续签,而不是等到最后一天。一个可靠的流程需要:

  • 定时尝试续签,并允许失败后重试;
  • 原子地替换证书文件,避免服务读到一半的新文件;
  • 让负载均衡器或 Web 服务器平滑重载;
  • 从外部监控线上实际提供的证书,而不只检查磁盘文件;
  • 对续签失败和剩余有效期过短发出告警。

私钥泄露时怎么办?

如果服务器私钥可能泄露,应:

  1. 生成一套新的服务器密钥对;
  2. 使用新公钥申请并部署新证书;
  3. 向 CA 撤销旧证书;
  4. 排查泄露原因并轮换相关凭据。

仅删除旧证书文件不能让已经复制私钥的攻击者失去能力。撤销信息可以通过 CRL 或 OCSP 发布,但客户端的检查策略并不完全一致,因此短有效期、快速换证和保护私钥同样重要。

5. 自签名证书与 CA 签发证书

自签名证书使用自己的私钥为自己签名,不存在通往公开受信任根 CA 的默认信任链。

它在加密算法层面仍然可以建立加密通道,但浏览器无法仅凭它确认服务器身份,通常会显示证书警告。自签名证书适合本地开发、测试或已经通过其他安全方式分发信任锚的内部系统,不适合直接面向普通公网用户。

企业内部 CA 也是同样的信任模型:只要组织把内部根证书安全地安装到受管设备的信任库,内部 CA 签发的证书就可以被这些设备信任,但不会自动被外部用户的浏览器信任。

6. 常见误区

误区一:CA 生成并保存服务器私钥

标准流程中,服务器私钥由申请者生成并保管,CA 只接收 CSR 中的公钥。某些托管服务可以代管密钥,但那是密钥托管方案,不是证书签发的必然步骤。

误区二:CSR 已经证明域名属于申请者

CSR 签名证明申请者持有对应私钥,域名控制权还要通过 HTTP、DNS 或其他合规方式验证。

误区三:证书被 CA 签名,浏览器就一定信任

浏览器还需要构建到本地受信任根 CA 的路径,并检查域名、有效期、用途、策略和私钥持有证明。由未知 CA 签发、证书链不完整或域名不匹配,都会导致验证失败。

误区四:CA 用私钥加密整张证书

CA 是对证书的待签名内容计算摘要并生成数字签名,不是把整张证书加密。证书内容本来就是公开的。

误区五:配置 HTTPS 后网站就绝对安全

证书和 TLS 主要保护传输通道并认证服务器身份,不能消除 XSS、SQL 注入、业务越权、恶意服务端或终端被控制等风险。

7. 面试追问速答

为什么使用中间 CA,而不是根 CA 直接签发网站证书?

为了隔离根密钥风险。根 CA 私钥可以离线保存;某个中间 CA 出现问题时,可以撤销或停止信任该中间 CA,而不必立即替换整个根信任体系。

证书签名和 TLS 握手签名有什么区别?

证书签名:CA 私钥签名证书内容
验证目的:证明证书由对应 CA 签发且内容未被修改

TLS 握手签名:服务器私钥签名当前握手上下文
验证目的:证明当前服务器持有叶子证书公钥对应的私钥

申请新证书时必须更换服务器私钥吗?

协议上不一定,但定期轮换私钥可以缩短单把私钥泄露后的影响范围。是否每次续签都换密钥,需要结合自动化能力、密钥硬件、合规要求和故障恢复方案决定。

8. 总结

CA 证书签发解决的是“为什么浏览器可以相信这个公钥代表目标域名”:

申请者持有服务器私钥
        +
CA 验证域名控制权
        +
CA 对域名、公钥和证书约束签名
        +
客户端沿证书链验证到本地信任根
        +
服务器在 TLS 握手中证明自己持有对应私钥
        =
客户端接受服务器身份

生产环境中,真正可靠的方案还必须覆盖完整生命周期:自动验证、自动签发、正确部署中间证书、提前续期、外部监控、私钥保护以及泄露后的撤销与换证。