如何为多客户端批量生成OpenVPN证书?

10 人参与

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

如何为多客户端批量生成OpenVPN证书?

批量生成的前置准备

Easy‑RSA 仍是官方推荐的 PKI 工具。先在服务器上创建一个独立的工作目录,例如 ~/vpn-ca,并执行 ./easyrsa init-pki 初始化。随后一次性构建根证书(./easyrsa build-ca),这一步的密码最好设为长且不易被猜到的随机串,防止后续私钥泄露。

脚本化生成流程

  • 准备客户端名单文件 clients.txt,每行一个标识,如 client01client02,可以直接从资产管理系统导出。
  • 编写 Bash 循环脚本,读取名单并调用 Easy‑RSA 的 gen-reqsign-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,赋予执行权限后直接跑,几分钟内即可产出上千份可直接使用的配置文件。省掉的手工操作时间,甚至可以用来喝杯咖啡。

参与讨论

10 条评论
  • 雾锁心门

    这脚本看着挺省事,但nopass真安全吗?

  • 寂光

    之前搞过这个,确实折腾了好久,光ta.key就配错三次

  • 星图探索者

    批量生成是爽,但证书回收咋办?没人提

  • 麻薯君

    太贵了吧这也,Easy-RSA都老掉牙了还用

  • 魂渡流浪

    client01这种命名也太随便了,资产系统导出不能带部门前缀?

  • 机灵刺猬

    感觉还行,至少比手动敲强

  • 蜜瓜小果冻

    求问生成的ovpn能直接导入安卓OpenVPN吗?

  • 糖糖罐

    又是标题党,说好的“实战方案”结果连错误处理都没写

  • 威武的雄鹰

    我服了,sign-req卡住那次直接崩了整个循环

  • Silver Rain

    把ca.crt和key全塞一个文件,权限控制真能靠chmod 400?