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 生效,要在任务计划里显式设置,否则交互执行正常、定时任务却读到默认文件。