一行代码生成 OpenSSL 自签名证书

moonjerx
2024-09-05 / 0 评论 / 56 阅读 / 正在检测是否收录...

引言

在开发环境中,有时我们需要快速生成一个自签名的 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=* 表示如果 $keyC= 开头,则执行后面的代码块。

${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

评论 (0)

取消

您的IP: