引言
在开发环境中,有时我们需要快速生成一个自签名的 SSL/TLS 证书以便进行测试或开发工作。使用 OpenSSL 工具可以轻松实现这一目标。本文将介绍如何通过一行命令生成自签名证书,并解释每一步骤的作用。
教程
快速生成自签名证书
假设我们已经安装了 OpenSSL 工具,并且希望在一个名为 cert
的目录中生成证书。下面是一行命令,它可以完成整个过程:
#!/bin/bash
# 创建 cert 目录存放证书文件
CERT_DIR="./cert"
mkdir -p "$CERT_DIR"
# 初始化配置变量并赋予默认值
default_C=XX
default_ST=Region
default_L=City
default_O=GlobalTrust
default_OU=CryptoServices
default_CN=localhost
default_emailAddress=crypto@globaltrust.com
default_PKCS12Password=888888**
# 初始化配置变量
C=
ST=
L=
O=
OU=
CN=
emailAddress=
PKCS12Password=
# 读取命令行参数
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
C=*)
C="${key#*=}"
;;
ST=*)
ST="${key#*=}"
;;
L=*)
L="${key#*=}"
;;
O=*)
O="${key#*=}"
;;
OU=*)
OU="${key#*=}"
;;
CN=*)
CN="${key#*=}"
;;
email=*|emailAddress=*)
emailAddress="${key#*=}"
;;
PKCS=*|PKCS12Password=*)
PKCS12Password="${key#*=}"
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
# 使用命令行参数和默认值初始化配置变量
C="${C:-$default_C}"
ST="${ST:-$default_ST}"
L="${L:-$default_L}"
O="${O:-$default_O}"
OU="${OU:-$default_OU}"
CN="${CN:-$default_CN}"
emailAddress="${emailAddress:-$default_emailAddress}"
PKCS12Password="${PKCS12Password:-$default_PKCS12Password}"
# 检查必须的配置项是否已设置
if [ -z "$C" ] || [ -z "$ST" ] || [ -z "$L" ] || [ -z "$O" ] || [ -z "$OU" ] || [ -z "$CN" ] || [ -z "$emailAddress" ] || [ -z "$PKCS12Password" ]; then
echo "Error: Missing required configuration options:"
for var in C ST L O OU CN emailAddress PKCS12Password; do
if [ -z "${!var}" ]; then
echo " * $var"
fi
done
exit 1
fi
# 在最终生成证书的目录下生成 info.txt 文本信息
cat > "$CERT_DIR/info.txt" <<EOF
# 国家代码(两个字母)
C=$C
# 省份或州
ST=$ST
# 城市
L=$L
# 组织名称
O=$O
# 组织单位名称
OU=$OU
# 公共名称(通常是主机名或IP地址)
CN=$CN
# 电子邮件地址
emailAddress=$emailAddress
# PKCS12 文件密码
PKCS12Password=$PKCS12Password
EOF
# 生成私钥
openssl genpkey -algorithm RSA -out "${CERT_DIR}/globaltrust.key" -pkeyopt rsa_keygen_bits:2048
# 创建证书请求
openssl req -new -key "${CERT_DIR}/globaltrust.key" -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN/emailAddress=$emailAddress" -out "${CERT_DIR}/globaltrust.csr"
# 创建自签名证书
openssl x509 -req -days 365 -in "${CERT_DIR}/globaltrust.csr" -signkey "${CERT_DIR}/globaltrust.key" -out "${CERT_DIR}/globaltrust.crt"
# 将证书转换为 PKCS12 格式
openssl pkcs12 -export -out "${CERT_DIR}/globaltrust.p12" -in "${CERT_DIR}/globaltrust.crt" -inkey "${CERT_DIR}/globaltrust.key" -passout pass:$PKCS12Password
echo "Certificates generated successfully in $CERT_DIR."
如何使用
保存上述脚本到一个文件中,例如 generate_cert.sh
,然后通过以下命令执行它:
chmod +x generate_cert.sh
./generate_cert.sh C=XX ST=Region L=City O=GlobalTrust OU=CryptoServices CN=localhost emailAddress=crypto@globaltrust.com PKCS12Password=888888**
你可以通过传递不同的参数来生成带有不同配置的证书。
通过远程命令生成证书
为了简化证书生成过程,我们可以在服务器上部署脚本,并提供一个可远程访问的 URL。例如,如果你的服务器上部署了脚本,并且 URL 是 https://example.com/download/generate-ssl.sh
,那么你可以通过以下命令轻松生成 SSL 证书:
curl -sSL https://example.com/download/generate-ssl.sh | bash -s -- C=XX ST=Region L=City O=GlobalTrust OU=CryptoServices CN=localhost emailAddress=crypto@globaltrust.com PKCS12Password=888888**
这条命令会下载脚本并立即执行,生成默认配置的 SSL 证书。如果需要传递参数,可以将参数添加到 bash
命令的末尾,如下所示:
curl -sSL https://example.com/download/generate-ssl.sh | bash -s -- C=XX ST=Region L=City O=GlobalTrust OU=CryptoServices CN=localhost emailAddress=crypto@globaltrust.com PKCS12Password=888888**
这样,你就可以通过远程调用的方式,在任何地方轻松生成自签名证书。
代码详解
配置变量初始化
国家代码(C
)
default_C=XX
C="${C:-$default_C}"
国家代码是两个字母的缩写,例如 US
表示美国。在这个示例中,默认值为 XX
,表示一个假想的国家代码。
省份或州(ST
)
default_ST=Region
ST="${ST:-$default_ST}"
省份或州的名称,默认值为 Region
。
城市(L
)
default_L=City
L="${L:-$default_L}"
城市名称,默认值为 City
。
组织名称(O
)
default_O=GlobalTrust
O="${O:-$default_O}"
组织名称,默认值为 GlobalTrust
。
组织单位名称(OU
)
default_OU=CryptoServices
OU="${OU:-$default_OU}"
组织单位名称,默认值为 CryptoServices
。
公共名称(CN
)
default_CN=localhost
CN="${CN:-$default_CN}"
公共名称通常是主机名或 IP 地址,默认值为 localhost
。
电子邮件地址(emailAddress
)
default_emailAddress=crypto@globaltrust.com
emailAddress="${emailAddress:-$default_emailAddress}"
联系人的电子邮件地址,默认值为 crypto@globaltrust.com
。
PKCS12 文件密码(PKCS12Password
)
default_PKCS12Password=888888**
PKCS12Password="${PKCS12Password:-$default_PKCS12Password}"
PKCS12 文件的密码,默认值为 888888**
。
命令行参数解析
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
C=*)
C="${key#*=}"
;;
ST=*)
ST="${key#*=}"
;;
L=*)
L="${key#*=}"
;;
O=*)
O="${key#*=}"
;;
OU=*)
OU="${key#*=}"
;;
CN=*)
CN="${key#*=}"
;;
email=*|emailAddress=*)
emailAddress="${key#*=}"
;;
PKCS=*|PKCS12Password=*)
PKCS12Password="${key#*=}"
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
解析命令行参数
while [[ $# -gt 0 ]]; do
[[
是 Bash 中的条件测试命令。$#
表示命令行参数的数量。-gt
是 "greater than" 的缩写,表示大于。0
表示零。do
开始循环体。
这段代码的意思是当命令行参数数量大于零时进入循环。
key="$1"
每次循环开始时,key
变量会被设置为当前命令行参数的第一个元素。
case $key in
case
语句用于模式匹配。它会根据 $key
的值进行匹配,并执行相应的代码块。
C=*
C=*
表示如果 $key
以 C=
开头,则执行后面的代码块。
${key#*=}
${key#*=}
是 Bash 的参数扩展语法,用于删除 $key
字符串开头的 =
符号及其前面的部分,从而提取出实际的值。
;;
;;
用来结束一个模式匹配的代码块。
shift # past argument or value
shift
命令用于将位置参数列表向左移动一个位置,移除第一个参数。这样在下次循环时,$1
就变成了原来的 $2
,以此类推。
检查必须的配置项是否已设置
if [ -z "$C" ] || [ -z "$ST" ] || [ -z "$L" ] || [ -z "$O" ] || [ -z "$OU" ] || [ -z "$CN" ] || [ -z "$emailAddress" ] || [ -z "$PKCS12Password" ]; then
echo "Error: Missing required configuration options:"
for var in C ST L O OU CN emailAddress PKCS12Password; do
if [ -z "${!var}" ]; then
echo " * $var"
fi
done
exit 1
fi
这段代码检查所有必需的配置选项是否已经被设置。如果任何一个选项为空,则打印错误信息并退出。
生成私钥
openssl genpkey -algorithm RSA -out "${CERT_DIR}/globaltrust.key" -pkeyopt rsa_keygen_bits:2048
openssl
是 OpenSSL 工具的命令。genpkey
用于生成公私钥对。-algorithm RSA
指定算法为 RSA。-out "${CERT_DIR}/globaltrust.key"
指定输出文件路径。-pkeyopt rsa_keygen_bits:2048
设置 RSA 密钥长度为 2048 位。
创建证书请求
openssl req -new -key "${CERT_DIR}/globaltrust.key" -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN/emailAddress=$emailAddress" -out "${CERT_DIR}/globaltrust.csr"
req
用于创建证书请求。-new
表示创建一个新的请求。-key "${CERT_DIR}/globaltrust.key"
指定私钥文件路径。-subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN/emailAddress=$emailAddress"
设置请求的主体信息。-out "${CERT_DIR}/globaltrust.csr"
指定输出文件路径。
创建自签名证书
openssl x509 -req -days 365 -in "${CERT_DIR}/globaltrust.csr" -signkey "${CERT_DIR}/globaltrust.key" -out "${CERT_DIR}/globaltrust.crt"
x509
用于处理 X.509 证书。-req
表示处理的是一个证书请求。-days 365
设置证书的有效期为 365 天。-in "${CERT_DIR}/globaltrust.csr"
指定证书请求文件路径。-signkey "${CERT_DIR}/globaltrust.key"
指定用于签名的私钥文件路径。-out "${CERT_DIR}/globaltrust.crt"
指定输出文件路径。
将证书转换为 PKCS12 格式
openssl pkcs12 -export -out "${CERT_DIR}/globaltrust.p12" -in "${CERT_DIR}/globaltrust.crt" -inkey "${CERT_DIR}/globaltrust.key" -passout pass:$PKCS12Password
pkcs12
用于处理 PKCS #12 文件。-export
表示导出证书和私钥。-out "${CERT_DIR}/globaltrust.p12"
指定输出文件路径。-in "${CERT_DIR}/globaltrust.crt"
指定证书文件路径。-inkey "${CERT_DIR}/globaltrust.key"
指定私钥文件路径。-passout pass:$PKCS12Password
设置导出文件的密码。
输出提示信息
echo "Certificates generated successfully in $CERT_DIR."
最后输出一条成功消息,告知证书已成功生成。
以上就是使用一行代码生成 OpenSSL 自签名证书的方法及其详细解释。通过这种方式,你可以快速地为你的开发环境生成所需的证书,无需复杂的配置过程。通过远程命令的方式,你还可以方便地在任意位置生成证书。
评论 (0)