实用脚本能自动生成SSL证书吗?

wen 实用脚本 3

本文目录导读:

实用脚本能自动生成SSL证书吗?

  1. 一键生成「自签名证书」(适合内网、开发、测试)
  2. 自动申请「Let's Encrypt 免费证书」(公网可信)
  3. 使用 acme.sh 脚本(更轻量、支持更多 DNS API)
  4. 生成「泛域名证书」的实用脚本
  5. 总结:选哪个脚本?

是的,有很多实用脚本可以自动生成SSL证书,尤其适合以下场景:

  1. 内网开发/测试环境(不需要公开 CA 签名)
  2. 个人或小团队服务(使用 Let's Encrypt 等免费 CA)
  3. 自动化部署流水线(CI/CD 中自动续签)

根据你的需求(是需要公开可信的证书还是自签名证书),推荐以下几种实用方式:


一键生成「自签名证书」(适合内网、开发、测试)

自签名证书浏览器会提示不安全,但用于 API 加密、内部服务或测试环境完全足够。

脚本示例(Shell):gen-self-signed.sh

#!/bin/bash
# 配置文件域名和有效期
DOMAIN="${1:-localhost}"
DAYS="${2:-3650}"
KEY_FILE="${DOMAIN}.key"
CRT_FILE="${DOMAIN}.crt"
echo ">>> 生成自签名证书 for $DOMAIN (有效期 $DAYS 天)"
# 1. 生成私钥
openssl genrsa -out "$KEY_FILE" 2048
# 2. 生成证书签名请求 (CSR) - 自动填充常见字段
openssl req -new -key "$KEY_FILE" -out "${DOMAIN}.csr" \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Dev/OU=IT/CN=$DOMAIN"
# 3. 生成自签名证书(同时指定 SAN 扩展,Chrome/Firefox 不再报 NET::ERR_CERT_COMMON_NAME_INVALID)
openssl x509 -req -days "$DAYS" -in "${DOMAIN}.csr" -signkey "$KEY_FILE" -out "$CRT_FILE" \
    -extfile <(printf "subjectAltName=DNS:$DOMAIN,DNS:localhost,IP:127.0.0.1")
# 清理临时文件
rm -f "${DOMAIN}.csr"
echo "完成:"
echo "  私钥: $KEY_FILE"
echo "  证书: $CRT_FILE"

用法:

chmod +x gen-self-signed.sh
./gen-self-signed.sh mydomain.local 365

自动申请「Let's Encrypt 免费证书」(公网可信)

如果你有一个公网域名,并能控制 DNS 或 Web 服务器,可以用 Certbot 一键申请并自动续签。

脚本示例:get-letsencrypt.sh

#!/bin/bash
DOMAIN="$1"
EMAIL="$2"
if [ -z "$DOMAIN" ] || [ -z "$EMAIL" ]; then
    echo "用法: $0 <域名> <邮箱>"
    exit 1
fi
echo ">>> 正在为 $DOMAIN 申请 Let's Encrypt 证书..."
# 安装 certbot(如果尚未安装)
which certbot > /dev/null 2>&1 || sudo apt install -y certbot
# 使用 standalone 模式(需要临时占用 80 端口)
sudo certbot certonly --standalone \
    --non-interactive \
    --agree-tos \
    --email "$EMAIL" \
    -d "$DOMAIN"
echo "证书位置:"
echo "  /etc/letsencrypt/live/$DOMAIN/fullchain.pem"
echo "  /etc/letsencrypt/live/$DOMAIN/privkey.pem"

自动化续签(crontab 每日执行):

0 3 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx

使用 acme.sh 脚本(更轻量、支持更多 DNS API)

acme.sh 是纯 Shell 脚本,也是 Let's Encrypt 的客户端,功能非常强大。

# 安装
curl https://get.acme.sh | sh
# 申请证书(自动 DNS 验证,需设置 API 密钥)
alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue -d example.com --dns dns_cf   # 以 Cloudflare 为例
# 安装到 Nginx(自动复制并重启)
acme.sh --install-cert -d example.com \
    --key-file /etc/nginx/ssl/example.com.key \
    --fullchain-file /etc/nginx/ssl/example.com.crt \
    --reloadcmd "systemctl reload nginx"

生成「泛域名证书」的实用脚本

如果你想用一个证书覆盖所有子域(*.example.com),可以用以下方式:

自签名泛域证书

openssl req -newkey rsa:2048 -nodes -keyout wildcard.key \
    -x509 -days 3650 -out wildcard.crt \
    -subj "/CN=*.example.com" \
    -addext "subjectAltName = DNS:*.example.com, DNS:example.com"

Let's Encrypt 泛域证书(需 DNS-01 验证)

acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf

选哪个脚本?

场景 推荐方案 证书类型
内网开发/测试 自签名脚本 自签名
个人博客/公网服务 Certbotacme.sh 公开可信
自动化 CI/CD acme.sh(纯 Shell,无依赖) 公开可信
微服务/容器内部 mkcert自签名脚本 自签名(可被本地信任)

另外推荐一个很好的工具:mkcert

# 安装 mkcert
brew install mkcert   # macOS
sudo apt install mkcert  # Linux(需添加仓库)
# 生成并信任本地证书
mkcert -install
mkcert localhost 127.0.0.1 ::1
# 输出:localhost+2.pem, localhost+2-key.pem (浏览器直接信任)

这些脚本和工具都能让你几分钟内自动化生成SSL证书,从而告别手动交互。

抱歉,评论功能暂时关闭!