#!/bin/bash # SSL证书申请脚本 - stock.allbyai.cn # 使用 acme.sh + DNS 验证方式申请免费SSL证书 # 适用于 DNSPod 有 Web 防护导致 HTTP 验证失败的情况 # 在服务器上执行此脚本 set -e DOMAIN="stock.allbyai.cn" SSL_DIR="/etc/nginx/ssl" ACME_HOME="/home/ubuntu/.acme.sh" echo "==========================================" echo "为 ${DOMAIN} 完成SSL证书安装" echo "==========================================" # 检查 acme.sh 是否已安装 if [ ! -f "${ACME_HOME}/acme.sh" ]; then echo "错误: acme.sh 未安装,请先运行初始化" exit 1 fi # 检查 DNS TXT 记录 echo "[1/4] 检查 DNS TXT 记录..." TXT_RECORD=$(dig +short TXT _acme-challenge.stock.allbyai.cn 2>/dev/null || echo "") if [ -z "$TXT_RECORD" ]; then echo "" echo "错误: DNS TXT 记录未找到!" echo "" echo "请在 DNSPod 添加以下 TXT 记录:" echo " 主机记录: _acme-challenge.stock" echo " 记录值: cM9lSA4-uKk-yjrvA38HYtmA1h7E3DzgIXVJq8IsSNo" echo "" echo "添加后等待 1-2 分钟,然后重新运行此脚本" exit 1 fi echo "DNS TXT 记录已找到: $TXT_RECORD" # 创建 SSL 目录 echo "[2/4] 创建 SSL 目录..." mkdir -p ${SSL_DIR} # 完成证书申请 echo "[3/4] 完成证书申请..." ${ACME_HOME}/acme.sh --renew -d ${DOMAIN} --yes-I-know-dns-manual-mode-enough-go-ahead-please # 安装证书 echo "[4/4] 安装证书到 Nginx..." ${ACME_HOME}/acme.sh --install-cert -d ${DOMAIN} \ --key-file ${SSL_DIR}/${DOMAIN}.key \ --fullchain-file ${SSL_DIR}/${DOMAIN}.crt \ --reloadcmd "systemctl reload nginx" # 更新 Nginx 配置 echo "[5/5] 更新 Nginx 配置..." cat > /etc/nginx/sites-available/${DOMAIN} << 'NGINX_CONF' # Nginx配置 - stock.allbyai.cn (HTTPS) server { listen 80; server_name stock.allbyai.cn; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name stock.allbyai.cn; ssl_certificate /etc/nginx/ssl/stock.allbyai.cn.crt; ssl_certificate_key /etc/nginx/ssl/stock.allbyai.cn.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; access_log /var/log/nginx/stock.allbyai.cn.access.log; error_log /var/log/nginx/stock.allbyai.cn.error.log; location / { proxy_pass http://127.0.0.1:3333; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; proxy_read_timeout 300s; proxy_connect_timeout 75s; } location /static/ { alias /opt/stock-app/static/; expires 7d; add_header Cache-Control "public, immutable"; } } NGINX_CONF # 重载 Nginx nginx -t && systemctl reload nginx echo "" echo "==========================================" echo "SSL证书安装完成!" echo "" echo "访问地址: https://${DOMAIN}" echo "" echo "证书信息:" echo " - 证书路径: ${SSL_DIR}/${DOMAIN}.crt" echo " - 密钥路径: ${SSL_DIR}/${DOMAIN}.key" echo " - 有效期: 90天" echo " - 自动续期: 已配置 (acme.sh cron)" echo "" echo "手动续期命令: ${ACME_HOME}/acme.sh --renew -d ${DOMAIN} --force" echo "=========================================="