申请免费证书
【增强版 Bash 脚本】:交互选择使用 Cloudflare DNS 或 HTTP 验证,支持三大 CA
#!/bin/bash
echo "====== Acme.sh 证书申请一键脚本 ======"
# ===== 输入基本信息 =====
read -p "请输入你的主域名(如 example.com): " DOMAIN
read -p "是否使用泛域名(*.${DOMAIN})? [y/N]: " WILDCARD
read -p "请输入你的邮箱地址(如 me@example.com): " EMAIL
# ===== 选择 CA 机构 =====
echo -e "\n请选择你要使用的证书颁发机构(CA):"
select CA_PROVIDER in "Let's Encrypt" "ZeroSSL" "Buypass"; do
case $REPLY in
1) CA_SERVER="letsencrypt"; break ;;
2) CA_SERVER="zerossl"; break ;;
3) CA_SERVER="buypass"; break ;;
*) echo "请输入 1-3 的数字";;
esac
done
# ===== 选择验证方式 =====
echo -e "\n请选择验证方式:"
select VERIFY_METHOD in "Cloudflare DNS 验证(推荐用于泛域名)" "Standalone HTTP 验证(监听80端口)"; do
case $REPLY in
1) VERIFY_METHOD="dns_cf"; DNS_MODE=true; break ;;
2) VERIFY_METHOD="standalone"; DNS_MODE=false; break ;;
*) echo "请输入 1 或 2";;
esac
done
# ===== 安装 acme.sh =====
if [ ! -d "$HOME/.acme.sh" ]; then
echo "[+] 安装 acme.sh ..."
curl https://get.acme.sh | sh
fi
source "$HOME/.acme.sh/acme.sh.env"
# ===== 注册账户 =====
acme.sh --set-default-ca --server $CA_SERVER
acme.sh --register-account -m "$EMAIL"
# ===== 处理域名格式 =====
if [[ "$WILDCARD" =~ ^[Yy]$ ]]; then
CERT_DOMAIN="*.$DOMAIN"
else
CERT_DOMAIN="$DOMAIN"
fi
# ===== 如果使用 Cloudflare,输入 Token =====
if [ "$DNS_MODE" = true ]; then
read -p "请输入你的 Cloudflare API Token: " CF_API_TOKEN
if [[ -z "$CF_API_TOKEN" ]]; then
echo "[✗] Token 不能为空!"
exit 1
fi
export CF_Token="$CF_API_TOKEN"
fi
# ===== 执行证书申请 =====
echo "[+] 开始申请证书: $CERT_DOMAIN"
if [ "$DNS_MODE" = true ]; then
acme.sh --issue --dns "$VERIFY_METHOD" -d "$CERT_DOMAIN" --force
else
echo "[!] 请确保 80 端口未被占用(如 nginx),或已临时关闭"
read -p "确认后按回车继续..."
acme.sh --issue --standalone -d "$CERT_DOMAIN" --force
fi
# ===== 安装证书到系统路径 =====
REAL_DOMAIN="${DOMAIN#*.}" # 去掉 *.
CERT_DIR="/etc/ssl/$REAL_DOMAIN"
mkdir -p "$CERT_DIR"
acme.sh --install-cert -d "$CERT_DOMAIN" \
--key-file "$CERT_DIR/key.pem" \
--fullchain-file "$CERT_DIR/fullchain.pem" \
--reloadcmd "echo '[✓] 可配置 nginx reload 命令'" \
--force
# ===== 自动更新启用 =====
acme.sh --upgrade --auto-upgrade
# ===== 成功信息 =====
echo -e "\n[✓] 证书申请成功!"
echo "私钥路径: $CERT_DIR/key.pem"
echo "完整证书路径: $CERT_DIR/fullchain.pem"
echo "自动续期: 已启用(每天检测)"
保存为xxx.sh,执行
chmod +x acme_cert_auto.sh
sudo ./acme_cert_auto.sh