首页/安全/加密与证书速查/openssl.cnf 配置文件结构

openssl.cnf 配置文件结构

openssl.cnf 决定 req、ca 等命令的默认字段、扩展模板与数据库路径:理解 [req] 与 [v3_*] 段落,可让签名脚本可重复、字段一致。

加密与证书速查安全更新于 2026-10-13

openssl.cnf 是什么

openssl.cnf 是 OpenSSL 命令行的主配置文件,决定 req、ca、x509 等命令的默认摘要算法、区分名字段、扩展模板与 CA 数据库路径。把它写好,签发脚本就能可重复执行且字段一致;反过来,靠命令行临时拼参数最容易漏掉 SAN 与关键扩展。理解 [req] 与 [v3_*] 两段的关系是配置的核心:[req] 声明用哪个段做扩展,[v3_*] 段才是扩展内容的定义。

基本信息

顶层openssl_conf 指向模块配置;[req] 定义区分名与扩展引用
常用段[req_distinguished_name]、[v3_req]、[v3_ca]、[ca]
扩展模板req_extensions / x509_extensions 指向具体段名
指定配置命令加 -config my.cnf 覆盖默认文件
默认位置随发行版与编译选项不同,可用 openssl version -d 查目录
典型陷阱段落写了但没被引用,等于没写

典型使用场景

  • 批量签发:用同一份模板保证 SAN、密钥用途、基本约束字段一致。
  • 自建 CA:定义 v3_ca 段区分 CA 证书与终端实体证书的扩展。
  • 脚本化运维:把配置纳入版本管理,签发结果可复现、可审计。
  • 排障比对:签发出的证书缺 SAN 或扩展异常时,先回看配置引用链。
  • 环境隔离:测试与生产各用一份配置,避免默认路径互相污染。

最小可用的签发配置

最小可用的签发配置
[req]
default_md = sha256
distinguished_name = dn
req_extensions = v3_req   # 引用下面的扩展段,漏了这行 SAN 不会生效
prompt = no

[dn]
C = CN
O = Example
CN = example.com

[v3_req]
subjectAltName = @alt
keyUsage = digitalSignature, keyEncipherment   # 终端实体常见用途

[alt]
DNS.1 = example.com
DNS.2 = www.example.com

段与字段读法

段/字段作用常见错误
[req]req 命令的默认行为入口缺少 req_extensions 引用,扩展不生效
[req_distinguished_name]区分名默认值字段留空导致证书主体不完整
[v3_req]请求中的扩展模板与 [v3_ca] 混用,签出用途错误的证书
[ca]ca 命令的数据库与策略路径路径未改指向默认目录,读写错文件
[alt]SAN 条目列表只写 DNS,漏掉 IP 与内网名
把 SAN 与扩展写进模板,比每次命令行传 -addext 更稳。签发前用 openssl req -in csr.pem -noout -text 核对扩展,比签完再回头查要省事。
多域名共用的 SAN 条目建议集中在 [alt] 段维护:一处改动覆盖全部签发脚本,比各脚本各写一份更不容易漏项,也方便把内网名与公网名分开管理。
命令行里的 -config 只影响本次调用,脚本中如果依赖环境变量 OPENSSL_CONF 生效,要在任务计划里显式设置,否则交互执行正常、定时任务却读到默认文件。

易错点

  • 复制他人配置后未核对默认路径:ca 命令读写错误的数据库,签发记录与序号混乱。
  • 模板段落未被引用:写了 [v3_req] 却忘了在 [req] 里用 req_extensions 指向它,签出的证书没有 SAN。
  • 在 [req] 里误用 x509_extensions:该字段作用于自签名证书,CSR 不会带上扩展,签出的证书依旧缺 SAN。
  • CA 与终端实体共用同一扩展段:签出的 CA 证书缺少 basicConstraints,链校验直接失败。
  • 配置散落多处未纳入版本管理:不同人签发的证书字段不一致,后期审计困难。

数据来源与参考

  • OpenSSL 官方文档(config)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌