easy-rsa 3.2.7 配置参数详解
easy-rsa 3.2.7 三层配置体系详解:vars 全参数总览与逐项生效实测(DN 模式/算法/有效期/摘要/critical)、openssl-easyrsa.cnf 结构、x509-types 模板定制与两套生产配置模板。
easy-rsa 3.2.7 配置参数详解
目标:讲清 easy-rsa 3.2.7 三层配置体系(vars 变量、openssl-easyrsa.cnf、x509-types 扩展模板)的每一项参数含义、默认值与生效验证方法,并给出可直接落地的生产配置模板。本文全部参数行为与回显在 Ubuntu 22.04.5 LTS(OpenSSL 3.0.2)+ easy-rsa v3.2.7 实机验证通过(验证日期 2026-10-28)。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- OpenSSL:3.0.2 15 Mar 2022(系统自带)
- easy-rsa:v3.2.7(官方 tarball,Git Commit
bab739d1),安装目录/opt/easy-rsa/3.2.7/ - 验证用 PKI 目录:
/opt/easy-rsa/3.2.7/pki(RSA 主线)、/opt/easy-rsa/c1-lab/pki(vars 定制验证)、/opt/easy-rsa/c1-ec/pki(EC 算法验证) - 验证日期:2026-10-28
二、前置条件
- 已按 《Ubuntu 22.04 安装 easy-rsa 3.2.7 指南》完成 tarball 安装与版本验证;
- 理解一个前提:easy-rsa 没有常驻进程,全部「配置」都是 easyrsa 脚本在每次执行时读取的变量与模板文件——改完即生效,无需重启任何服务;
- 各配置文件的查找顺序(由 easyrsa 脚本实现):
- 全局选项显式指定(
--vars=FILE、--ssl-cnf=FILE)优先级最高; vars:默认在 PKI 目录(pki/vars)→ 当前工作目录 → easyrsa 脚本所在目录,依次查找;openssl-easyrsa.cnf:pki/内优先,其次 easyrsa 脚本所在目录;x509-types/:pki/x509-types/优先(可放每 PKI 定制),其次 easyrsa 脚本所在目录。
- 全局选项显式指定(
三、配置的三个层次:vars / openssl.cnf / x509-types
easy-rsa 的配置分三层,职责互不重叠:
| 层次 | 文件 | 职责 | 语法 |
|---|---|---|---|
| 变量层 | vars | 控制流程行为:DN 模式、算法、有效期、口令模式、批量模式等 | shell set_var NAME "value" |
| OpenSSL 配置层 | openssl-easyrsa.cnf | CA 数据库路径、扩展段引用、CRL/证书字段映射(一般无需动) | OpenSSL conf 语法 |
| 证书扩展层 | x509-types/<type> | 每类证书的 X509v3 扩展(EKU/KU/basicConstraints 等) | OpenSSL 扩展语法 |
vars 文件的启用规则(最容易踩坑的点,实测见第九章 Q1):官方 tarball 里只带 vars.example,必须改名为 vars 才会被读取;文件名不对时 easy-rsa 静默使用内置默认值,不会报错。
vars 文件头部还有一段保护代码,防止旧习惯性 source:
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA *vars* file. This is" >&2
echo "no longer necessary and is disallowed. See the section called" >&2
echo "*How to use this file* near the top comments for more details." >&2
return 1
fi
含义:3.x 的 vars 不再(也不能)source 进环境,只能由 easyrsa 脚本自身加载;直接 source vars 会命中该保护分支返回错误。
四、vars 参数总览
以下为 vars.example(v3.2.7)列出的全部可设参数,默认值列即不设置时 easy-rsa 的内置行为:
| 变量 | 默认值 | 作用 |
|---|---|---|
EASYRSA | easyrsa 脚本所在目录 | 配置基目录(cnf/x509-types 的查找根) |
EASYRSA_OPENSSL | openssl(PATH 内) | OpenSSL 可执行文件路径 |
EASYRSA_DN | cn_only | DN 模式:cn_only 仅 CN;org 完整组织字段 |
EASYRSA_REQ_COUNTRY | US | org 模式国家码(C) |
EASYRSA_REQ_PROVINCE | California | org 模式省/州(ST) |
EASYRSA_REQ_CITY | San Francisco | org 模式城市(L) |
EASYRSA_REQ_ORG | Copyleft Certificate Co | org 模式组织(O) |
EASYRSA_REQ_EMAIL | me@example.net | org 模式邮箱(emailAddress) |
EASYRSA_REQ_OU | My Organizational Unit | org 模式部门(OU) |
EASYRSA_PRESERVE_DN | (未设) | 签发时保留 CSR 原始 DN 字段顺序(仅 org 模式) |
EASYRSA_NO_PASS | (未设) | 设 1 则整套 PKI 默认无口令(等效全局 --nopass) |
EASYRSA_KEY_SIZE | 2048 | RSA 密钥位长 |
EASYRSA_ALGO | rsa | 算法:rsa / ec / ed |
EASYRSA_CURVE | secp384r1 | EC/EdDSA 命名曲线(ed 默认 ed25519) |
EASYRSA_CA_EXPIRE | 3650 | CA 证书有效期(天) |
EASYRSA_CERT_EXPIRE | 825 | 终端证书有效期(天) |
EASYRSA_CRL_DAYS | 180 | CRL 有效期(天);过期后使用该 CRL 的 OpenVPN 服务端会拒绝全部新连接 |
EASYRSA_RAND_SN | yes | 随机序列号(no 则回退旧式递增序号) |
EASYRSA_PRE_EXPIRY_WINDOW | 90 | expire 命令的临期检查窗口(天) |
EASYRSA_AUTO_SAN | (未设) | 自动以 CN 生成 subjectAltName(CN 为 IP 则生成 IP:) |
EASYRSA_BC_CRIT / EASYRSA_KU_CRIT / EASYRSA_EKU_CRIT / EASYRSA_SAN_CRIT | (未设;SAN 默认按官方随 v3.2.7 起标记 critical) | 对应 X509 扩展加 critical 标记 |
EASYRSA_NO_INLINE | (未设) | 禁用 inline 文件自动生成 |
EASYRSA_NS_SUPPORT | no | 已废弃的 Netscape 扩展开关 |
EASYRSA_NS_COMMENT | Easy-RSA Generated Certificate | nsComment 字段(仅 NS_SUPPORT=yes 时生效) |
EASYRSA_EXT_DIR | $EASYRSA/x509-types(pki 内优先) | 证书扩展模板目录 |
EASYRSA_KDC_REALM | CHANGEME.EXAMPLE.COM | KDC 证书 realm(当前非功能项) |
EASYRSA_SSL_CONF | $EASYRSA_PKI/openssl-easyrsa.cnf | 指定 OpenSSL 配置文件 |
EASYRSA_DIGEST | sha256 | 摘要算法(md5/sha1/sha256/sha224/sha384/sha512) |
EASYRSA_BATCH | 空 | 设非空值进入无人值守批量模式 |
💡 技术拓展:DN(Distinguished Name, distinguished name 甄别名)模式的选择影响所有证书的 subject 结构。
cn_only只有一个 CN 字段,简洁、交互快,适合 OpenVPN 这类只看 CN 的场景;org模式带 C/ST/L/O/OU/email 七字段,适合需要按组织归档、合规审计的正式 CA。两者互斥,建 CA 时确定后不宜更换(更换需重建 PKI)。
参数写入格式为 set_var(vars 文件内定义的 shell 函数),值必须带引号:
set_var EASYRSA_KEY_SIZE "3072"
五、核心参数分类详解(逐项实测验证)
本章每组参数都给出「配置 → 操作 → 回显验证」的实测闭环。实测方法:在 /opt/easy-rsa/c1-lab/ 复制 easyrsa 主程序与模板、写定制 vars,从 init-pki 开始走完整签发链,用 openssl 输出验证每个参数真实生效。
5.1 DN 模式与组织字段(EASYRSA_DN、EASYRSA_REQ_*)
定制 vars 内容(c1-lab 实测):
set_var EASYRSA_DN "org"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Beijing"
set_var EASYRSA_REQ_ORG "Example Corp"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "IT Department"
init-pki 回显出现 vars 被识别的提示:
Using Easy-RSA Auto-configured 'vars' file:
* /opt/easy-rsa/c1-lab/vars
build-ca 时 org 模式的完整交互(8 个字段,方括号内即 vars 提供的默认值,回车全部采纳):
Country Name (2 letter code) [CN]:State or Province Name (full name) [Beijing]:Locality Name (eg, city) [Beijing]:Organization Name (eg, company) [Example Corp]:Organizational Unit Name (eg, section) [IT Department]:Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Email Address [admin@example.com]:Serial-number (eg, device serial-number) []:
注意 org 模式比 cn_only 多出最后的 Serial-number 字段(实体序列号,可空)。签发后的证书 subject 实测:
subject=C = CN, ST = Beijing, L = Beijing, O = Example Corp, OU = IT Department, CN = pki-org-ca, emailAddress = admin@example.com
七个字段全部来自 vars 默认值,证明 EASYRSA_REQ_* 生效;交互时输入 . 可将单个字段留空(email 除外)。
5.2 密钥算法与曲线(EASYRSA_ALGO / EASYRSA_CURVE / EASYRSA_KEY_SIZE)
RSA 位长验证:上述 c1-lab vars 同时设置 set_var EASYRSA_KEY_SIZE 3072,签发后:
Public-Key: (3072 bit)
EC 算法验证(独立目录 c1-ec,vars 仅三行):
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_CURVE "secp256r1"
set_var EASYRSA_DN "cn_only"
build-ca 后验证 CA 证书密钥:
Signature Algorithm: ecdsa-with-SHA256
ASN1 OID: prime256v1
NIST CURVE: P-256
三条算法路线的取舍:
💡 技术拓展:密钥算法对比——
算法 密钥长度 性能 兼容性 适用 RSA(默认) 2048/3072/4096 签发慢、验证快 最好 兼容性优先的通用场景 EC(ecdsa) P-256/P-384 等短密钥 签发与协商都快 现代客户端基本都支持 移动端/高性能 TLS EdDSA(ed25519) 固定 256bit 最快 较新生态(OpenSSH、新 TLS 栈) 纯内部、栈可控场景 本文示例主线用 RSA 3072(兼顾兼容与强度),内部新部署可用 EC P-256。注意:
EASYRSA_KEY_SIZE只对 RSA 有效;切算法属于 PKI 级决策,init-pki时落盘后中途更换需重建 PKI。
5.3 有效期(EASYRSA_CA_EXPIRE / EASYRSA_CERT_EXPIRE / EASYRSA_CRL_DAYS)
c1-lab vars 设置 set_var EASYRSA_CERT_EXPIRE 365,签发 web-server 证书时 sign-req 确认页直接显示生效:
Requested CN: 'web-server'
Requested type: 'server'
Valid for: '365' days
签发后 openssl 验证(2026-10-28 签发,一年整):
notBefore=Oct 28 05:18:11 2026 GMT
notAfter=Oct 28 05:18:11 2027 GMT
对照:默认 EASYRSA_CERT_EXPIRE 825 时签发回显为 Valid for: '825' days(2026-10-28 → 2029-01-30)。CA 有效期同理:默认 3650 天时 build-ca 的 openssl 调用带 -days 3650,实测 CA 至 2036-10-25(10 年)。
EASYRSA_CRL_DAYS 只影响 gen-crl 产物:实测默认 180 天 CRL 的 Next Update 字段:
Last Update: Oct 28 05:14:01 2026 GMT
Next Update: Apr 26 05:14:01 2027 GMT
官方在 vars.example 中对该参数有重要警告(原文):CRL 过期后,使用该 CRL 的 OpenVPN 服务端会拒绝所有新连接,直到换上新 CRL——生产环境必须把 gen-crl 纳入周期任务(默认 180 天一换,可缩短)。
5.4 摘要算法(EASYRSA_DIGEST)
c1-lab vars 设置 set_var EASYRSA_DIGEST "sha384",签发链全程实测切换:
Signature Algorithm: sha384WithRSAEncryption
(对照默认值 sha256 时的 sha256WithRSAEncryption。)可选值仅 vars.example 列出的 md5/sha1/sha256/sha224/sha384/sha512;现代场景保持默认 sha256 或升 sha384,不要回退 md5/sha1。
5.5 序列号策略(EASYRSA_RAND_SN)
默认 yes:每张证书随机 128bit 序列号(实测签发的序列号形如 7f:a2:c0:28:5b:cd:41:95:f6:d3:41:92:89:5c:0a:57)。设 no 回退递增小序号(01、02…),仅建议兼容古董系统时使用——随机序列号可规避部分实现按序号预测的碰撞与过滤问题。
5.6 扩展与 critical 标记(EASYRSA_AUTO_SAN / EASYRSA_*_CRIT)
EASYRSA_AUTO_SAN 1:等效全局--auto-san,签发时自动把 CN 写入 subjectAltName(CN 为 IP 地址时生成IP:条目,否则DNS:)。web 服务证书建议显式--san或开启该项,否则仅 CN 的证书在主流浏览器/客户端校验下不可用(本文端到端验证时 curl 即因 CN 不含访问主机名而报exit=60校验失败,见 D1 篇实录);EASYRSA_BC_CRIT/EASYRSA_KU_CRIT/EASYRSA_EKU_CRIT/EASYRSA_SAN_CRIT:把对应扩展标为 critical。CA 自身的basicConstraints与keyUsage在 x509-types/ca 模板中本就是 critical;SAN critical 自 v3.2.7 起有专门的处理逻辑(官方 Release Notes:default_vars(): If defined, set EASYRSA_SAN_CRIT to 'critical,')。
5.7 口令模式(EASYRSA_NO_PASS / nopass)
set_var EASYRSA_NO_PASS 1 使整套 PKI 默认无口令;更常用的是命令级 nopass 选项,仅对本次生成的私钥生效。两者取舍:
- 服务端私钥(nginx/OpenVPN server):常配
nopass,否则服务重启需要人工输口令; - CA 私钥与客户端私钥:保持口令加密。CA 私钥泄露即整套信任链失守,CA 口令不可省。
实测:./easyrsa build-server-full openvpn-server nopass 生成的私钥无加密头(openssl rsa -in ... -check -noout 免口令通过),而默认 gen-req 生成的私钥为 BEGIN ENCRYPTED PRIVATE KEY。
5.8 批量与运行环境(EASYRSA_BATCH / EASYRSA / EASYRSA_OPENSSL / EASYRSA_EXT_DIR / EASYRSA_SSL_CONF)
EASYRSA_BATCH:非空即无人值守模式,跳过全部确认(含 sign-req 的 yes 确认与危险操作确认),脚本化首选;配套全局选项--batch等效;EASYRSA_OPENSSL:多 OpenSSL 共存时指定路径;EASYRSA_EXT_DIR:指向自定义扩展模板目录(放 pki 内可实现「单 PKI 级」定制);EASYRSA_SSL_CONF:替换 OpenSSL 配置,属高级特性——easy-rsa 对配置段名有约定,不能直接换成任意标准 openssl.cnf。
常用全局选项速查(./easyrsa help 实测节选,均为命令行级、优先级高于 vars):
--batch|-b : Set automatic (no-prompts when possible) mode
--pki=DIR : Declare the PKI directory (Default PKI directory is sub-directory 'pki')
--vars=FILE : Define a specific 'vars' file to use for Easy-RSA config
--ssl-cnf=FILE : Define a specific OpenSSL config file for Easy-RSA to use
--umask=ARG : Define a UMASK (Default 077)
--days=# : Sets the signing validity to the specified number of days
--digest=ALG : Digest to use in the requests & certificates
--keysize=# : Size in bits of keypair to generate (RSA Only)
--algo=ALG : Crypto algorithm to use: choose rsa (default), ec or ed
--curve=NAME : For elliptic curve, sets the named curve
--san|--subject-alt-name=SUBJECT_ALT_NAME : Add a subjectAltName (可多次使用)
--nopass : Do not use passwords
六、openssl-easyrsa.cnf 结构与定制
tarball 内的 openssl-easyrsa.cnf 是 easy-rsa 专用配置,init-pki 时会复制一份到 pki/。其核心特征是全部路径变量化(实测文件头):
[ CA_default ]
dir = $ENV::EASYRSA_PKI # Where everything is kept
certs = $dir # Where the issued certs are kept
crl_dir = $dir # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir/certs_by_serial # default place for new certs.
certificate = $dir/ca.crt # The CA certificate
serial = $dir/serial # The current serial number
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca.key # The private key
要点解读:
$ENV::EASYRSA_PKI:easyrsa 每次调用 openssl 前把 PKI 目录注入环境变量,因此同一份 cnf 可服务任意 PKI 目录——这是 easy-rsa「一份脚本跑多套 PKI」的基础;database = $dir/index.txt:CA 数据库即该文件,show-revoke/serial命令读的台账都在这里;- 文件中还有
#%COPY_EXTS%占位行,是--copy-ext(复制 CSR 中 SAN 等扩展)机制所需的锚点,官方注释明确不得删除或改动该行; - 签发时 easyrsa 并不直接引用这份文件,而是复制到临时会话目录(实测回显
Using configuration from /opt/easy-rsa/3.2.7/pki/1802e39f/temp.00),会话结束自动清理。
日常运维不需要改这个文件;确需深度定制(如自定义扩展段、policy 段)时,复制一份改名后用 --ssl-cnf 指向,避免覆盖升级丢失。
七、x509-types 扩展模板定制
x509-types/ 下每类一个纯文本文件,签发对应类型证书时引用。v3.2.7 内置 8 个:ca / client / server / serverClient / code-signing / email / kdc / COMMON(COMMON 存在时会先被包含进所有类型)。
server 类型原文(实测 cat x509-types/server):
# X509 extensions for a server
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
extendedKeyUsage = serverAuth
keyUsage = digitalSignature,keyEncipherment
client 类型与 server 的差异仅在 EKU/KU:
extendedKeyUsage = clientAuth
keyUsage = digitalSignature
CA 类型(CA:TRUE + 签证书签 CRL 能力):
basicConstraints = critical,CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
keyUsage = cRLSign, keyCertSign
定制方法:在 pki/x509-types/ 下放同名文件即覆盖默认(PKI 级生效),或改 EASYRSA_EXT_DIR 整体换目录。典型定制:给 server 加 subjectAltName = DNS:example.com、给长生命周期内部服务放宽 KU。改动后对新签发立即生效,已签发证书不受影响(扩展在签发时刻固化)。
八、生产配置模板
模板一:OpenVPN 服务 CA(最常见,兼容性优先)。适用:4C8G 中小服务器、数百终端规模、以 OpenVPN 接入为主的场景:
# /opt/easy-rsa/3.2.7/vars(cp vars.example vars 后追加/修改)
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_KEY_SIZE "2048"
set_var EASYRSA_CA_EXPIRE "3650"
set_var EASYRSA_CERT_EXPIRE "825"
set_var EASYRSA_CRL_DAYS "90"
set_var EASYRSA_DIGEST "sha256"
set_var EASYRSA_RAND_SN "yes"
解读:cn_only 降低交互成本;CRL 收紧到 90 天并配 cron 每月 gen-crl,避免官方警告的「CRL 过期全员拒连」;其余保持官方默认。
模板二:内部服务 mTLS CA(组织信息入证)。适用:合规要求证书含组织信息、证书量数百以内、磁盘任意(PKI 目录 < 100MB):
set_var EASYRSA_DN "org"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Beijing"
set_var EASYRSA_REQ_ORG "Example Corp"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "IT Department"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_CURVE "secp384r1"
set_var EASYRSA_CA_EXPIRE "3650"
set_var EASYRSA_CERT_EXPIRE "398"
set_var EASYRSA_DIGEST "sha384"
解读:EC P-384 在保证强度下密钥与握手开销最小;398 天对齐主流公共 CA 上限习惯,便于轮换纪律;org 字段全部显式声明避免交互漏填。
九、常见问题(FAQ)
Q1:明明改了 vars,为什么参数没生效?
实测复现:把含 set_var EASYRSA_KEY_SIZE 4096 的文件命名为 vars.txt,init-pki 回显中不会出现 Using Easy-RSA Auto-configured 'vars' file 提示——easy-rsa 静默忽略它。解决:改名为 vars;或临时用全局选项 --vars=/path/to/任意名文件 显式指定(实测该选项对任意文件名有效)。自查口诀:init-pki/build-ca 回显里找「Auto-configured 'vars'」提示,有它才是真加载。
Q2:vars 应该放在哪?pki/ 里面还是外面?
两处都认:查找顺序为 PKI 目录 → 当前工作目录 → easyrsa 脚本目录。推荐放 easyrsa 脚本同级(版本目录内,随版本管理);注意 init-pki 会把脚本目录的 vars.example 复制进 pki/(仅是样例拷贝,不自动生效),不要误以为那是正在生效的文件。
Q3:org 模式 build-ca 交互要答几个问题?顺序是什么?
实测共 10 次输入:CA 口令两遍 + 8 个 DN 字段(Country → Province → City → Organization → OU → Common Name → Email → Serial-number)。全部回车即采纳 vars 默认值;想改某项输入新值即可。管道喂入自动化时必须数对行数(实测喂 9 行会在 Serial-number 处 EOF,openssl 报 Error making certificate request)。
Q4:--days 命令行参数和 vars 里的有效期谁赢?
命令行全局选项优先于 vars。临时签一张短测证书可直接 ./easyrsa --days=30 sign-req server tmp01,不必改 vars。
Q5:EASYRSA_BATCH 模式下 CA 口令怎么传?
--batch 只关确认交互,口令仍需供给:用 --passin=pass:你的口令 --passout=pass:你的口令 全局选项(help 原文示例 pass:xEasyRSAy 形式)。注意口令会出现在进程参数里,受限环境改用 --passin=file:/path/to/pwfile。
十、参考链接
- 官方 vars.example(v3.2.7):https://github.com/OpenVPN/easy-rsa/blob/master/vars.example
- 官方 Advanced 文档(--vars/--ssl-cnf 语义):https://github.com/OpenVPN/easy-rsa/blob/master/doc/EasyRSA-Advanced.md
- 官方 X509 扩展说明:https://github.com/OpenVPN/easy-rsa/blob/master/doc/EasyRSA-Readme.md
- OpenSSL config 手册(cnf 语法背景):https://www.openssl.org/docs/man3.0/man5/config.html
站内延伸阅读:
- 组件定位与选型对比:《easy-rsa 3.2.7 介绍与选型指南》
- 安装与 CA 初始化全流程:《Ubuntu 22.04 安装 easy-rsa 3.2.7 指南》
- 签发/吊销/CRL 全流程命令实录:见本专栏《easy-rsa 3.2.7 常用 CLI 命令与工具详解》篇