【问题标题】:How to generate openvpn client key dynamically with php and pass variables to shell command?如何使用php动态生成openvpn客户端密钥并将变量传递给shell命令?
【发布时间】:2026-02-20 17:20:10
【问题描述】:

我想用 PHP 生成客户端密钥。当生成客户端密钥时,它应该给我密钥的到期日期。

root@zohaib-VirtualBox:/etc/openvpn/easy-rsa# ./build-key client1

生成 2048 位 RSA 私钥 .................................................... .....................+++ ...................... ..+++

将新的私钥写入“client1.key” 您将被要求输入将包含在您的证书请求中的信息。您将要输入的是所谓的专有名称或 DN。有很多字段,但可以留空一些字段会有默认值,

如果您输入“.”,该字段将留空。 国家名称(2 个字母代码)[GB]:

州或省名称(全名)[伦敦]:

地区名称(例如,城市)[伦敦]:

组织名称(例如,公司)[Org]:

组织单位名称(例如,部分)[]:

通用名称(例如,您的姓名或服务器的主机名)[client1]:

名称 [组织服务器]:

电子邮件地址 [admin@org.com]:

请输入以下要与您的证书请求一起发送的“额外”属性

挑战密码[]:

可选的公司名称 []:

使用来自 /etc/openvpn/easy-rsa/openssl-1.0.0.cnf 的配置

检查请求是否匹配签名 Signature ok Subject's Distinguished Name 如下

countryName :PRINTABLE:'GB'

stateOrProvinceName :PRINTABLE:'London'

localityName :PRINTABLE:'London'

organizationName :PRINTABLE:'Org'

commonName :PRINTABLE:'client1'

名称:PRINTABLE:'OrgServer'

emailAddress :IA5STRING:'admin@gamban.com'

证书要在 GMT 2026 年 4 月 21 日 15:43:47 之前进行认证(3650 天) 签署证书? [y/n]:y

1 个证书请求中的 1 个已通过认证,提交? [y/n]y

用 1 个新条目写出数据库

数据库更新

root@zohaib-VirtualBox:/etc/openvpn/easy-rsa#

【问题讨论】:

  • 现在我只是在命令行中手动创建密钥,但现在我希望它在 php 中执行并取回密钥到期日期等结果。
  • 你能发布一个命令生成的输出的例子吗?
  • 请看下面的脚本
  • 我已经更新了我的答案。希望对您有所帮助!

标签: php bash shell key openvpn


【解决方案1】:

您可以使用shell_exec 并获取要使用的结果,例如,使用正则表达式来匹配密钥的到期日期等,即:

$ovpnKey = shell_exec("your command here");

命令的结果将保存在 var $ovpnKey


更新:

要自动创建新的 OpenVPN 客户端证书,请使用以下脚本。确保至少编辑以下变量OPENVPN_RSA_DIROPENVPN_KEYSKEY_DOWNLOAD_PATH

#! /bin/bash
# Script to automate creating new OpenVPN clients
# The client cert and key, along with the CA cert is
# zipped up and placed somewhere to download securely
#
# H Cooper - 05/02/11
#
# Usage: new-openvpn-client.sh <common-name>

# Set where we're working from
OPENVPN_RSA_DIR=/etc/openvpn/easy-rsa/2.0
OPENVPN_KEYS=$OPENVPN_RSA_DIR/keys
KEY_DOWNLOAD_PATH=/var/www/secure

# Either read the CN from $1 or prompt for it
if [ -z "$1" ]
    then echo -n "Enter new client common name (CN): "
    read -e CN
else
    CN=$1
fi

# Ensure CN isn't blank
if [ -z "$CN" ]
    then echo "You must provide a CN."
    exit
fi

# Check the CN doesn't already exist
if [ -f $OPENVPN_KEYS/$CN.crt ]
    then echo "Error: certificate with the CN $CN alread exists!"
        echo "    $OPENVPN_KEYS/$CN.crt"
    exit
fi

# Enter the easy-rsa directory and establish the default variables
cd $OPENVPN_RSA_DIR
source ./vars > /dev/null

# Copied from build-key script (to ensure it works!)
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --batch $CN

# Take the new cert and place it somewhere it can be downloaded securely
zip -q $KEY_DOWNLOAD_PATH/$CN-`date +%d%m%y`.zip keys/$CN.crt keys/$CN.key keys/ca.crt

# Celebrate!
echo ""
echo "#############################################################"
echo "COMPLETE! Download the new certificate here:"
echo "https://domain.com/secure/$CN-`date +%d%m%y`.zip"
echo "#############################################################"

将上述 bash 脚本保存为new-openvpn-client.sh 并赋予其执行权限。

然后使用phpshell_exec生成密钥:

$ovpnKey = shell_exec("sh /full/path/to/new-openvpn-client.sh <common-name>");

来源:

https://gist.github.com/hcooper/814247

【讨论】:

  • 但它也提出了许多问题来填充如何用 php 填充这些值?查看上面的代码。
  • 适用于我的 CentOS 7。甚至可以从 Web URL 调用,同时为相应的文件和目录添加一些读取和/或写入权限。