使用 Certbot + 阿里云 DNS 配置泛域名 SSL 证书全流程(以 test 域名为例)

Yi Nginx 2025-06-15 50

使用Certbot + 阿里云DNS配置泛域名SSL证书(不使用虚拟环境)

一、环境准备

确保服务器已安装以下组件(以CentOS为例):

sudo yum install certbot python3-pip nginx -y

二、安装Certbot阿里云DNS插件

直接使用pip3安装(需注意权限提示,可忽略或使用--user参数):

sudo pip3 install certbot-dns-aliyun

三、创建阿里云凭证文件

# 生成凭证文件(替换为你的AccessKey)
cat > /etc/letsencrypt/aliyun.ini << EOF
dns_aliyun_access_key = YOUR_ACCESS_KEY_ID
dns_aliyun_access_key_secret = YOUR_ACCESS_KEY_SECRET
EOF

# 设置安全权限(仅root可读)
chmod 600 /etc/letsencrypt/aliyun.ini

四、申请泛域名证书(以test.com为例)

certbot certonly \
  --authenticator dns-aliyun \
  --dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
  --dns-aliyun-propagation-seconds 600 \
  -m your@email.com \
  --agree-tos \
  -d "*.test.com" \
  -d "test.com" \
  --server https://acme-v02.api.letsencrypt.org/directory

证书路径

/etc/letsencrypt/live/test.com/fullchain.pem  # 证书
/etc/letsencrypt/live/test.com/privkey.pem    # 私钥

五、配置自动续期

# 编辑cron任务
crontab -e

# 添加续期命令(每月1日0点执行,续期后重载Nginx)
0 0 1 * * certbot renew --quiet --deploy-hook "systemctl reload nginx"

# 测试续期
certbot renew --dry-run

六、Nginx配置HTTPS

# /etc/nginx/conf.d/test.com.conf
server {
    listen 443 ssl http2;
    server_name test.com *.test.com;
    
    ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
    
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    root /var/www/test;
    index index.html;
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name test.com *.test.com;
    return 301 https://$host$request_uri;
}

重载Nginx:

sudo nginx -t && systemctl reload nginx

七、多域名配置(不使用虚拟环境)

若需配置多个域名(如test.comexample.com):

  1. 为每个域名单独申请证书:
    # 申请test.com证书
    certbot certonly --authenticator dns-aliyun ... -d "*.test.com"
    
    # 申请example.com证书
    certbot certonly --authenticator dns-aliyun ... -d "*.example.com"
    
  2. Nginx中分别配置证书路径:
    # example.com的server块
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    

八、常见问题与解决方案

  1. 依赖冲突
    • 错误提示:No matching distribution found for acme>=2.0.0
    • 解决方案:升级pipsetuptools
      sudo pip3 install --upgrade pip setuptools
      
  2. 权限不足
    • 确保阿里云AccessKey拥有AliyunDNSFullAccess权限,且凭证文件权限为600
  3. 证书申请失败
    • 查看日志:cat /var/log/letsencrypt/letsencrypt.log,常见原因包括DNS解析延迟或域名重复(通配符已覆盖根域名,无需重复添加)。

九、总结

不使用虚拟环境时,直接通过pip3安装插件更简洁,但需注意系统Python依赖可能产生的冲突。配置完成后,Certbot会自动管理证书续期,Nginx通过配置不同server块支持多域名HTTPS服务。如需更高隔离性,仍建议使用虚拟环境(python3 -m venv)避免全局包冲突。