Skip to content

证书与 TLS:对象、配置与机制 ​

证书、私钥、名称与信任链 ​

证书管理包括证书内容、对应私钥、服务端发送链和客户端信任。先区分名称、有效期与签发关系,再设计部署和轮换;复制一张新证书不能保证所有入口与客户端已经使用正确版本。

证书、私钥与CSR ​

CSR携带待签名公钥与申请信息,证书是签发者对身份与公钥绑定的声明,私钥用于证明持有对应秘密。CSR不是服务端证书,证书也不包含私钥。把三者分别命名与存储,签发后仍需核对实际SAN、用途和有效期,不能假设申请内容全部被照搬。

信任锚与颁发者 ​

信任锚由客户端或管理策略预先信任,并非服务器发来了根证书就自动可信。根证书自签名只描述结构,不说明值得信任。组织私有CA需要通过受控渠道分发到正确客户端信任库;浏览器、系统与语言运行时可能使用不同的库。

文件格式和权限 ​

PEM以文本包装DER数据,一个文件可含多个对象。扩展名不能保证内容类型,部署前核对对象、顺序与密钥匹配。私钥文件限制访问且不写进仓库;含私钥的PKCS12不是公开证书。本文示例只处理虚构元数据,不生成真实密钥和证书。

练习与参考解答 ​

练习:目录中有server.csr和一份自签根证书,但没有server证书。能否把CSR作为服务端证书并把根发给客户端就建立信任?

参考解答

不能,CSR是申请而非已签发叶子证书,服务器还需对应私钥。根自签不代表客户端信任,必须通过受控渠道预置信任锚;签发后核对SAN、用途、期限及密钥匹配。记录申请对象和客户端实际信任库,不能靠扩展名或服务端发送根来判断。

证书校验、信任锚与轮换机制 ​

先明确预期服务名、叶子/中间证书和客户端信任锚,再对照配套示例理解实际入口证书、SAN、期限与链验证。

构建与验证路径 ​

完整证书链通常由服务端提供叶子和必要中间证书,客户端在信任库中寻找信任锚。发送根证书不能补救客户端不信任,缺中间证书也不一定在所有客户端同样失败,因为缓存或获取行为可能不同。路径验证还要检查约束、用途和算法,不能只比较issuer与subject字符串。

名称匹配与SAN ​

SAN名称与客户端预期服务身份匹配:DNS名按DNS标识规则,IP地址需要相应IP标识,不能用解析到同一地址代替名称匹配。RFC9525不再使用CN回退作为通用方案。通配符不是任意层级匹配,*.example.invalid不覆盖example.invalid或a.b.example.invalid。

有效期与时钟 ​

有效期由notBefore和notAfter界定,客户端时钟错误会使尚未生效或已过期判断异常。续签不自动替换已部署文件;要查实际对外呈现的序列号与期限。证书剩余时间预警留出审批、发布与回退窗口,不能在最后一天才安排更新。

SNI与验证名称 ​

SNI在握手中帮助服务端选择证书,校验名称是客户端判断身份的依据;两者相关但不是同一步。连接IP同时发送域名SNI时,仍需明确客户端按哪个预期名称验证。仅看到正确SNI不能证明名称校验已开启,教学程序也不实现TLS握手。

撤销与私钥泄露 ​

撤销可通过CRL、OCSP等机制表达,但各客户端支持与失败策略不同。私钥泄露后应隔离、生成新密钥并重新签发,撤销旧证书及核查使用范围;只延长有效期不能消除泄露。不要承诺所有客户端在撤销后立即拒绝,需要核对客户端行为。

练习与参考解答 ​

练习:客户端预期db.example.invalid;链可连到其信任根,但叶子只有SAN=*.example.invalid。它是否覆盖db.example.invalid、example.invalid和a.b.example.invalid?SNI正确能否替代名称验证?

参考解答

按本课单层通配范围,只覆盖db.example.invalid,不覆盖根域或多层a.b.example.invalid。SNI用于服务端选择证书,不等于客户端已执行名称验证;还需检查用途、期限和约束。链可信与服务身份匹配是分开的必要条件。

继续阅读