acme.sh生成ssl证书脚本,支持泛域名
acme.sh生成ssl证书脚本,支持泛域名
现在免费的ssl证书有效期都只有3个月了,动不动就要续,另外还不支持泛域名。 不想花钱的话,还得靠acme.sh。
废话不多说,直接上脚本。
以下脚本可以放到服务器上定时执行,实测发现在腾讯云主机执行证书生成过程中有关的接口可能访问有点问题,建议因为海外主机执行。
运行命令
./ssl-generator.sh daozhao.com
./ssl-generator.sh '*daozhao.com'
以生成robot.daozhao.com的证书为例,生成过程如下

#!/bin/bash
# SSL 证书自动生成脚本
# 用法: ./ssl-generator.sh <主域名> [额外域名...] [acme.sh参数...]
# 配置
SSL_BASE_DIR="/home/website/ssl"
ACME_SH="$HOME/.acme.sh/acme.sh"
# 解析参数
MAIN_DOMAIN=""
DOMAIN_ARGS=""
ACME_ARGS=""
for arg in "$@"; do
case "$arg" in
-*)
ACME_ARGS="$ACME_ARGS $arg"
;;
*)
if [ -z "$MAIN_DOMAIN" ]; then
MAIN_DOMAIN="$arg"
fi
DOMAIN_ARGS="$DOMAIN_ARGS -d $arg"
;;
esac
done
# 检查参数
if [ -z "$MAIN_DOMAIN" ]; then
echo "用法: $0 <主域名> [额外域名...] [acme.sh参数...]"
echo ""
echo "示例:"
echo " $0 daozhao.com"
echo " $0 daozhao.com www.daozhao.com"
echo " $0 daozhao.com --force"
echo " $0 daozhao.com --debug"
echo " $0 daozhao.com --force --debug --log"
echo ""
echo "常用 acme.sh 参数:"
echo " --force 强制重新申请"
echo " --debug 显示调试信息"
echo " --log 记录日志"
echo " --test 测试模式(不会真正申请证书)"
echo ""
exit 1
fi
# 检查 acme.sh 是否已安装
if [ ! -f "$ACME_SH" ]; then
echo "安装 acme.sh..."
curl https://get.acme.sh | sh
source ~/.profile
fi
# 证书目录命名:domain.com_nginx
CERT_DIR_NAME="${MAIN_DOMAIN}_nginx"
SSL_DIR="$SSL_BASE_DIR/$CERT_DIR_NAME"
# 创建证书目录
mkdir -p "$SSL_DIR"
echo "=========================================="
echo "SSL 证书生成"
echo "=========================================="
echo "主域名: $MAIN_DOMAIN"
echo "证书目录: $SSL_DIR"
echo "额外参数: $ACME_ARGS"
echo ""
# 如果只有一个域名,自动判断是否需要加 www
DOMAIN_COUNT=$(echo "$DOMAIN_ARGS" | tr ' ' '\n' | grep -c '^-d$')
if [ "$DOMAIN_COUNT" -eq 1 ]; then
PARTS=$(echo "$MAIN_DOMAIN" | tr '.' '\n' | wc -l)
if [ "$PARTS" -lt 3 ]; then
DOMAIN_ARGS="$DOMAIN_ARGS -d www.$MAIN_DOMAIN"
fi
fi
echo "申请证书包含以下域名:"
echo "$DOMAIN_ARGS" | tr ' ' '\n' | grep -v '^$' | grep -v '^-d$' | while read line; do
[ -n "$line" ] && echo " - $line"
done
echo ""
# 申请证书(透传所有额外参数)
echo "正在申请证书..."
$ACME_SH --issue --dns dns_tencent $DOMAIN_ARGS $ACME_ARGS
# 证书文件路径(腾讯云风格命名)
CSR_FILE="$SSL_DIR/${MAIN_DOMAIN}.csr"
KEY_FILE="$SSL_DIR/${MAIN_DOMAIN}.key"
BUNDLE_CRT_FILE="$SSL_DIR/${MAIN_DOMAIN}_bundle.crt"
BUNDLE_PEM_FILE="$SSL_DIR/${MAIN_DOMAIN}_bundle.pem"
# 安装证书
echo ""
echo "安装证书到 $SSL_DIR..."
$ACME_SH --install-cert -d "$MAIN_DOMAIN" \
--cert-file "$SSL_DIR/${MAIN_DOMAIN}.cer" \
--key-file "$SSL_DIR/${MAIN_DOMAIN}.key" \
--fullchain-file "$SSL_DIR/${MAIN_DOMAIN}.fullchain.cer"
# 重命名为腾讯云风格
# acme.sh 使用 ECC 证书,目录名带 _ecc 后缀
ACME_CERT_DIR="$HOME/.acme.sh/${MAIN_DOMAIN}_ecc"
if [ -f "$ACME_CERT_DIR/${MAIN_DOMAIN}.csr" ]; then
cp "$ACME_CERT_DIR/${MAIN_DOMAIN}.csr" "$CSR_FILE"
echo "✅ CSR 文件已生成: $CSR_FILE"
else
echo "⚠️ CSR 文件不存在"
fi
# 移动并重命名证书文件
mv "$SSL_DIR/${MAIN_DOMAIN}.key" "$KEY_FILE" 2>/dev/null || true
mv "$SSL_DIR/${MAIN_DOMAIN}.fullchain.cer" "$BUNDLE_CRT_FILE" 2>/dev/null || true
# 生成 .pem 文件(确保成功)
if [ -f "$BUNDLE_CRT_FILE" ]; then
cp "$BUNDLE_CRT_FILE" "$BUNDLE_PEM_FILE"
echo "✅ PEM 文件已生成: $BUNDLE_PEM_FILE"
else
echo "⚠️ 警告: CRT 文件不存在,无法生成 PEM"
fi
# 清理临时文件
rm -f "$SSL_DIR/${MAIN_DOMAIN}.cer" 2>/dev/null || true
# 验证文件
echo ""
echo "验证证书文件..."
FILES_OK=true
for f in "$KEY_FILE" "$BUNDLE_CRT_FILE" "$BUNDLE_PEM_FILE"; do
if [ -f "$f" ]; then
echo " ✅ $(basename $f)"
else
echo " ❌ $(basename $f) 缺失"
FILES_OK=false
fi
done
# 重载 Nginx(在所有文件生成完成后)
if [ "$FILES_OK" = true ]; then
echo ""
echo "重载 Nginx 配置..."
nginx -s reload 2>/dev/null && echo "✅ Nginx 已重载" || echo "⚠️ Nginx 重载失败,请手动执行: nginx -s reload"
fi
echo ""
echo "=========================================="
echo "✅ 证书申请完成!"
echo "=========================================="
echo "证书目录: $SSL_DIR"
echo ""
echo "证书文件:"
echo " - CSR 文件: $CSR_FILE"
echo " - 私钥文件: $KEY_FILE"
echo " - 证书链: $BUNDLE_CRT_FILE"
echo " - PEM 文件: $BUNDLE_PEM_FILE"
echo ""
echo " 证书将自动续期"
echo " 查看证书状态: $ACME_SH --list"
- 分类:
- Devops
相关文章
道招网正式开启https
之前我只是对微信小程序好奇,搞了个子域名 https://w.daozhao.com,现在发现越来越多的场景需要https,加上现在的主机貌似只支持一个域名用ssl证书,单独买个多域名ssl证书比较贵 阅读更多…
使用app的华为应用内支付服务还是小心为上,2023年了还有人在支付场景使用http。。。
近期查看邮件的时候发现华为开发者联盟发的一封邮件,大致意思就是出于安全考虑,将于2023年10月1日全面限制应用内支付服务使用HTTP回调地址了。 众所周知HTTP协议以明文方式发送内容,不提供 阅读更多…
Charles抓取https请求unknown?赶紧换Proxyman吧
前几年使用 Charles 的时候发现抓取https报文很容易出现结果unknown的情况,其实就是因为无法解密出https这类加密请求,一般都要通过借助Charles自己的证书来解决。 网上包 阅读更多…
axios请求https网站报错Unable to verify the first certificate
今天在使用axios出现了一个错误 Unable to verify the first certificate ,就感觉是证书的问题,自己手动在浏览器中输入https的网站没问题啊,但是在用axi 阅读更多…
amh.sh免费泛域名https证书 自动续期
自己的网站一直使用的https,用ssl证书就是在腾讯云免费申请的,有限期一年,过期了可以再次申请。腾讯云说是有50个免费名额,个人觉得还是够用的。 要说缺点的话也是有的 不能自 阅读更多…
nginx开启https parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf
安装nginx,一般是安装在/usr/local/nginx nginx基本操作 cd /usr/local/nginx/sbin 启动 ./nginx 关闭 ./ngin 阅读更多…