在企业内部部署 OpenVPN 时,往往需要一次性为上百台终端下发证书,手工操作的繁琐程度堪比在键盘上敲击“Ctrl+Alt+Del”。如果把这件事比作烘焙,那么一次性烤出一盘饼干远比单个手工烤要省时省力得多。下面从准备工作到脚本实现,完整梳理一套批量生成 OpenVPN 客户端证书的实战方案。

Easy‑RSA 仍是官方推荐的 PKI 工具。先在服务器上创建一个独立的工作目录,例如 ~/vpn-ca,并执行 ./easyrsa init-pki 初始化。随后一次性构建根证书(./easyrsa build-ca),这一步的密码最好设为长且不易被猜到的随机串,防止后续私钥泄露。
clients.txt,每行一个标识,如 client01、client02,可以直接从资产管理系统导出。gen-req 与 sign-req,全部使用 nopass 参数免除交互。.crt、.key 与公共 CA 证书、TLS‑auth 密钥打包为单个 .ovpn 文件,便于通过 SCP 或 S3 分发。#!/usr/bin/env bash
cd ~/vpn-ca
# 读取 clients.txt
while IFS= read -r name; do
./easyrsa gen-req "$name" nopass &&
./easyrsa sign-req client "$name" nopass < /dev/null
# 生成 .ovpn
cat <<EOF > "$name.ovpn"
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
key-direction 1
$(cat pki/ca.crt)
$(cat pki/issued/$name.crt)
$(cat pki/private/$name.key)
$(cat ta.key)
EOF
done < clients.txt
echo "All client profiles generated."
如果在 sign-req 时忘记提供 nopass,脚本会卡在交互式密码输入,导致批处理瞬间失效。另一个细节是 ta.key 必须在服务器和所有客户端保持一致,否则即使证书合法,TLS‑auth 仍会报错。实际部署中,我把 ta.key放在只读目录,并在生成 .ovpn 时用 chmod 400 限制权限,防止意外泄露。
一句话概括:把证书生成当成一次“批量烘焙”,脚本就是烤箱。
把上述脚本保存为 gen_clients.sh,赋予执行权限后直接跑,几分钟内即可产出上千份可直接使用的配置文件。省掉的手工操作时间,甚至可以用来喝杯咖啡。
参与讨论
这脚本看着挺省事,但nopass真安全吗?
之前搞过这个,确实折腾了好久,光ta.key就配错三次
批量生成是爽,但证书回收咋办?没人提
太贵了吧这也,Easy-RSA都老掉牙了还用
client01这种命名也太随便了,资产系统导出不能带部门前缀?
感觉还行,至少比手动敲强
求问生成的ovpn能直接导入安卓OpenVPN吗?
又是标题党,说好的“实战方案”结果连错误处理都没写
我服了,sign-req卡住那次直接崩了整个循环
把ca.crt和key全塞一个文件,权限控制真能靠chmod 400?