feat: 移除Certbot方案,统一使用acme.sh + 添加自动续期配置

核心改进:
1. 移除Certbot (方案1)
   - 原因:Python依赖冲突(urllib3)难以解决
   - 用户已用acme.sh成功申请证书
   - acme.sh更轻量、更可靠

2. 优化SSL方案选择菜单
   - 新方案1:acme.sh + Let's Encrypt (推荐)
   - 新方案2:acme.sh + ZeroSSL
   - 新方案3:acme.sh + Buypass
   - 新方案4-5:阿里云/腾讯云
   - 新方案6-7:手动上传/暂不配置

3. 添加自动续期配置功能
   - 新增setup_acme_auto_renew()函数
   - 自动检查并启动cron服务
   - 验证acme.sh自动续期任务
   - 显示续期时间和配置信息
   - 提供续期检查命令

4. 自动续期特性:
   -  每天自动检查证书
   -  证书到期前30天自动续期
   -  续期后自动重载Nginx
   -  无需手动干预

5. 用户体验改进:
   - 显示详细的续期配置信息
   - 提供手动续期命令
   - 统一的续期管理方式
   - 完成提示中显示续期检查命令

技术细节:
- acme.sh安装时自动创建cron任务
- 兼容cron/crond两种服务名
- 支持systemctl和传统service管理
- 显示预计续期时间(从证书配置文件读取)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
WanWanYun
2025-11-13 15:24:08 +08:00
parent 691d4ad075
commit d5fada3a26

View File

@@ -1089,36 +1089,112 @@ configure_domain() {
# SSL证书配置
################################################################################
# 配置acme.sh自动续期
setup_acme_auto_renew() {
echo ""
print_step "配置SSL证书自动续期..."
# acme.sh安装时会自动创建cron任务这里验证并确保其正常工作
# 1. 检查cron服务是否运行
if systemctl is-active --quiet cron 2>/dev/null || systemctl is-active --quiet crond 2>/dev/null; then
print_success "Cron服务运行正常"
else
print_warning "Cron服务未运行正在启动..."
systemctl start cron 2>/dev/null || systemctl start crond 2>/dev/null || true
systemctl enable cron 2>/dev/null || systemctl enable crond 2>/dev/null || true
fi
# 2. 检查acme.sh cron任务
if crontab -l 2>/dev/null | grep -q "acme.sh.*--cron"; then
print_success "acme.sh自动续期任务已配置"
else
print_warning "未检测到acme.sh cron任务正在添加..."
# acme.sh会自动安装cron这里手动触发一次
~/.acme.sh/acme.sh --install-cronjob 2>/dev/null || true
fi
# 3. 显示续期信息
echo ""
print_info "SSL证书自动续期已配置:"
echo " - 检查频率: 每天自动检查"
echo " - 续期时机: 证书到期前30天自动续期"
echo " - 续期后操作: 自动重载Nginx"
echo ""
# 显示下次续期时间
if [[ -f ~/.acme.sh/${DOMAIN}/${DOMAIN}.conf ]]; then
NEXT_RENEW=$(grep "Le_NextRenewTime=" ~/.acme.sh/${DOMAIN}/${DOMAIN}.conf 2>/dev/null | cut -d'=' -f2)
if [[ -n "$NEXT_RENEW" ]]; then
RENEW_DATE=$(date -d "@${NEXT_RENEW}" "+%Y年%m月%d日 %H:%M:%S" 2>/dev/null || date -r ${NEXT_RENEW} "+%Y年%m月%d日 %H:%M:%S" 2>/dev/null || echo "未知")
print_info "预计续期时间: ${RENEW_DATE}"
fi
fi
# 4. 测试续期命令(不实际续期,只检查)
print_info "验证续期配置..."
if ~/.acme.sh/acme.sh --list 2>/dev/null | grep -q "$DOMAIN"; then
print_success "证书续期配置验证通过"
else
print_warning "证书列表中未找到域名,续期可能需要手动配置"
fi
echo ""
}
choose_ssl_method() {
echo ""
print_step "选择SSL证书部署方式"
echo ""
echo -e "${YELLOW}【推荐方案】${NC}"
echo -e "${GREEN}[1]${NC} Certbot (Let's Encrypt官方工具)"
echo " - 最稳定可靠,支持自动续期"
echo -e "${GREEN}[1]${NC} acme.sh + Let's Encrypt"
echo " - 纯Shell脚本轻量级稳定"
echo " - 自动续期,无需手动操作"
echo ""
echo -e "${YELLOW}【备选方案】${NC}"
echo -e "${GREEN}[2]${NC} acme.sh + Let's Encrypt"
echo " - 纯Shell脚本更轻量级"
echo -e "${GREEN}[3]${NC} acme.sh + ZeroSSL"
echo -e "${GREEN}[2]${NC} acme.sh + ZeroSSL"
echo " - Let's Encrypt的免费替代品"
echo -e "${GREEN}[5]${NC} acme.sh + Buypass"
echo -e "${GREEN}[3]${NC} acme.sh + Buypass"
echo " - 挪威免费CA有效期180天"
echo ""
echo -e "${YELLOW}【云服务商证书】${NC}"
echo -e "${GREEN}[4]${NC} 阿里云免费证书 (需提供AccessKey)"
echo -e "${GREEN}[6]${NC} 腾讯云免费证书 (需提供SecretKey)"
echo -e "${GREEN}[5]${NC} 腾讯云免费证书 (需提供SecretKey)"
echo ""
echo -e "${YELLOW}【其他选项】${NC}"
echo -e "${GREEN}[7]${NC} 使用已有证书 (手动上传)"
echo -e "${GREEN}[8]${NC} 暂不配置HTTPS (可后续配置)"
echo -e "${GREEN}[6]${NC} 使用已有证书 (手动上传)"
echo -e "${GREEN}[7]${NC} 暂不配置HTTPS (可后续配置)"
echo ""
while true; do
read -p "请输入选项 [1-8]: " ssl_choice < /dev/tty
read -p "请输入选项 [1-7]: " ssl_choice < /dev/tty
case $ssl_choice in
1|2|3|4|5|6|7|8)
SSL_METHOD=$ssl_choice
1)
SSL_METHOD="2" # acme.sh + Let's Encrypt
break
;;
2)
SSL_METHOD="3" # acme.sh + ZeroSSL
break
;;
3)
SSL_METHOD="5" # acme.sh + Buypass
break
;;
4)
SSL_METHOD="4" # 阿里云
break
;;
5)
SSL_METHOD="6" # 腾讯云
break
;;
6)
SSL_METHOD="7" # 手动上传
break
;;
7)
SSL_METHOD="8" # 不配置HTTPS
break
;;
*)
@@ -1135,9 +1211,6 @@ deploy_ssl() {
fi
case $SSL_METHOD in
1)
deploy_certbot || ssl_fallback "1"
;;
2)
deploy_acme_letsencrypt || ssl_fallback "2"
;;
@@ -1174,12 +1247,6 @@ ssl_fallback() {
# 动态显示可用选项(排除已失败的)
local available_options=()
# 方案1: Certbot
if [[ "$failed_method" != "1" ]]; then
echo -e "${GREEN}[1]${NC} Certbot (Let's Encrypt官方工具)"
available_options+=("1")
fi
# 方案2: acme.sh + Let's Encrypt
if [[ "$failed_method" != "2" ]]; then
echo -e "${GREEN}[2]${NC} acme.sh + Let's Encrypt"
@@ -1192,24 +1259,12 @@ ssl_fallback() {
available_options+=("3")
fi
# 方案4: 阿里云(注释掉,未实现)
# if [[ "$failed_method" != "4" ]]; then
# echo -e "${GREEN}[4]${NC} 阿里云免费证书"
# available_options+=("4")
# fi
# 方案5: acme.sh + Buypass
if [[ "$failed_method" != "5" ]]; then
echo -e "${GREEN}[5]${NC} acme.sh + Buypass"
available_options+=("5")
fi
# 方案6: 腾讯云(注释掉,未实现)
# if [[ "$failed_method" != "6" ]]; then
# echo -e "${GREEN}[6]${NC} 腾讯云免费证书"
# available_options+=("6")
# fi
# 方案8: 不配置HTTPS
echo -e "${GREEN}[8]${NC} 暂不配置HTTPS"
available_options+=("8")
@@ -1228,12 +1283,6 @@ ssl_fallback() {
fi
case $retry_choice in
1)
deploy_certbot && return 0
# 如果再次失败继续调用fallback但排除方案1
ssl_fallback "1"
return $?
;;
2)
deploy_acme_letsencrypt && return 0
# 如果再次失败继续调用fallback但排除方案2
@@ -1245,11 +1294,6 @@ ssl_fallback() {
ssl_fallback "3"
return $?
;;
4)
deploy_aliyun_ssl && return 0
ssl_fallback "4"
return $?
;;
5)
deploy_acme_buypass && return 0
ssl_fallback "5"
@@ -1551,6 +1595,9 @@ deploy_acme_letsencrypt() {
print_warning "Nginx未运行将在后续步骤启动"
fi
# 配置自动续期
setup_acme_auto_renew
return 0
else
print_error "证书安装失败"
@@ -1707,6 +1754,9 @@ deploy_acme_zerossl() {
print_warning "Nginx未运行将在后续步骤启动"
fi
# 配置自动续期
setup_acme_auto_renew
return 0
else
print_error "证书安装失败"
@@ -1863,6 +1913,9 @@ deploy_acme_buypass() {
print_warning "Nginx未运行将在后续步骤启动"
fi
# 配置自动续期
setup_acme_auto_renew
return 0
else
print_error "证书安装失败"
@@ -2810,15 +2863,13 @@ print_completion() {
# SSL续期提示
if [[ "$USE_DOMAIN" == "true" ]] && [[ "$SSL_METHOD" != "8" ]]; then
echo -e "${YELLOW}SSL证书:${NC}"
case $SSL_METHOD in
1)
echo " 自动续期: 已配置Certbot自动续期"
;;
2|3|4)
echo "动续期: 已配置acme.sh自动续期"
;;
esac
echo -e "${YELLOW}SSL证书自动续期:${NC}"
echo " - 方式: acme.sh cron任务"
echo " - 频率: 每天自动检查"
echo " - 时机: 证书到期前30天自动续期"
echo " - 检查任务: crontab -l | grep acme"
echo " - 查看证书: ~/.acme.sh/acme.sh --list"
echo " - 手动续期: ~/.acme.sh/acme.sh --renew -d $DOMAIN --force"
echo ""
fi