本文目录导读:

- 一键生成「自签名证书」(适合内网、开发、测试)
- 自动申请「Let's Encrypt 免费证书」(公网可信)
- 使用
acme.sh脚本(更轻量、支持更多 DNS API) - 生成「泛域名证书」的实用脚本
- 总结:选哪个脚本?
是的,有很多实用脚本可以自动生成SSL证书,尤其适合以下场景:
- 内网开发/测试环境(不需要公开 CA 签名)
- 个人或小团队服务(使用 Let's Encrypt 等免费 CA)
- 自动化部署流水线(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
选哪个脚本?
| 场景 | 推荐方案 | 证书类型 |
|---|---|---|
| 内网开发/测试 | 自签名脚本 | 自签名 |
| 个人博客/公网服务 | Certbot 或 acme.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证书,从而告别手动交互。