要使用 Nginx、Certbot 和 Cloudflare API 实现自动 SSL 证书签发和续约,您需要完成以下步骤。

本文将分为准备工作、配置 Nginx 和 Certbot、使用 Cloudflare API 更新 DNS 记录,以及配置自动续约。


一、准备工作

  1. 安装必要的软件

    • 安装 Nginx:

      sudo apt update
      sudo apt install nginx -y
    • 安装 Certbot 和 Nginx 插件:

      sudo apt install certbot python3-certbot-nginx -y
  2. 设置 Cloudflare API Token

    • 登录 Cloudflare 账户,进入 API Tokens 页面。
    • 创建一个新的 API Token,选择 Custom Token,并设置适合的权限:

      • Zone.Zone: Read
      • Zone.DNS: Edit
    • 将生成的 API Token 保存到一个安全的地方。
  3. 绑定域名到 Cloudflare 并将 DNS 指向您的服务器

    • 在 Cloudflare DNS 设置中配置 A 记录,将域名指向您的服务器公网 IP 地址。

二、配置 Nginx 和 Certbot

  1. 创建 Nginx 配置文件
    假设您的域名是 example.com,为其创建一个 Nginx 配置文件:

    sudo nano /etc/nginx/sites-available/example.com

配置文件内容如下:

server {
   listen 80;
   server_name example.com www.example.com;

   location /.well-known/acme-challenge/ {
       root /var/www/certbot;
   }

   location / {
       return 301 https://$host$request_uri;
   }
}

保存并退出,然后创建一个符号链接使其生效:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  1. 创建 Certbot 的验证目录
    Certbot 会在 .well-known/acme-challenge/ 中放置验证文件:

    sudo mkdir -p /var/www/certbot
    sudo chown www-data:www-data /var/www/certbot
  2. 测试 Nginx 配置并重新加载
    测试 Nginx 配置是否正确:

    sudo nginx -t

    如果没有问题,重新加载 Nginx:

    sudo systemctl reload nginx
  3. 使用 Cloudflare DNS 插件签发证书
    Certbot 提供了一个专门的 Cloudflare DNS 插件(certbot-dns-cloudflare),您需要先安装它:

    sudo apt install python3-certbot-dns-cloudflare -y

然后,在您的服务器上创建一个配置文件来存储 Cloudflare API Token:

sudo nano /etc/letsencrypt/cloudflare.ini

文件内容如下:

dns_cloudflare_api_token = your_cloudflare_api_token

替换 your_cloudflare_api_token 为您之前创建的 API Token。

确保该文件的权限足够安全:

sudo chmod 600 /etc/letsencrypt/cloudflare.ini
  1. 签发 SSL 证书
    使用 Certbot 配合 Cloudflare 插件签发证书:

    sudo certbot certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
    -d example.com -d www.example.com

如果签发成功,证书文件会存储在 /etc/letsencrypt/live/example.com/ 目录下。

  1. 配置 Nginx 使用 SSL
    修改 Nginx 配置文件以启用 HTTPS:

    sudo nano /etc/nginx/sites-available/example.com

修改后的配置如下:

server {
   listen 80;
   server_name example.com www.example.com;
   return 301 https://$host$request_uri;
}

server {
   listen 443 ssl;
   server_name example.com www.example.com;

   ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

   location / {
       root /var/www/html;
       index index.html;
   }
}

保存并退出,测试配置并重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

三、配置自动续约

  1. 测试续约功能

Certbot 提供了一个命令用于测试续约:

sudo certbot renew --dry-run

如果没有问题,说明续约功能正常。

  1. 设置定时任务

Certbot 安装时通常会自动创建一个定时任务。如果没有,可以手动创建一个:

sudo crontab -e

在文件中添加以下内容:

0 3 * * * certbot renew --quiet --renew-hook "systemctl reload nginx"

这将每天凌晨 3 点运行一次证书续约,并在证书续约成功后自动重载 Nginx。


四、总结

通过以上步骤,您成功配置了 Nginx 和 Certbot,并通过 Cloudflare DNS API 进行 SSL 证书的自动签发和续约。Certbot 会定期检查证书是否即将过期,并在需要时自动续约,无需手动干预。

标签: none

添加新评论