要使用 Nginx、Certbot 和 Cloudflare API 实现自动 SSL 证书签发和续约
要使用 Nginx、Certbot 和 Cloudflare API 实现自动 SSL 证书签发和续约,您需要完成以下步骤。
本文将分为准备工作、配置 Nginx 和 Certbot、使用 Cloudflare API 更新 DNS 记录,以及配置自动续约。
一、准备工作
安装必要的软件
安装 Nginx:
sudo apt update sudo apt install nginx -y
安装 Certbot 和 Nginx 插件:
sudo apt install certbot python3-certbot-nginx -y
设置 Cloudflare API Token
- 登录 Cloudflare 账户,进入 API Tokens 页面。
创建一个新的 API Token,选择 Custom Token,并设置适合的权限:
- Zone.Zone: Read
- Zone.DNS: Edit
- 将生成的 API Token 保存到一个安全的地方。
绑定域名到 Cloudflare 并将 DNS 指向您的服务器
- 在 Cloudflare DNS 设置中配置 A 记录,将域名指向您的服务器公网 IP 地址。
二、配置 Nginx 和 Certbot
创建 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/
创建 Certbot 的验证目录
Certbot 会在.well-known/acme-challenge/
中放置验证文件:sudo mkdir -p /var/www/certbot sudo chown www-data:www-data /var/www/certbot
测试 Nginx 配置并重新加载
测试 Nginx 配置是否正确:sudo nginx -t
如果没有问题,重新加载 Nginx:
sudo systemctl reload nginx
使用 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
签发 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/
目录下。
配置 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
三、配置自动续约
- 测试续约功能
Certbot 提供了一个命令用于测试续约:
sudo certbot renew --dry-run
如果没有问题,说明续约功能正常。
- 设置定时任务
Certbot 安装时通常会自动创建一个定时任务。如果没有,可以手动创建一个:
sudo crontab -e
在文件中添加以下内容:
0 3 * * * certbot renew --quiet --renew-hook "systemctl reload nginx"
这将每天凌晨 3 点运行一次证书续约,并在证书续约成功后自动重载 Nginx。
四、总结
通过以上步骤,您成功配置了 Nginx 和 Certbot,并通过 Cloudflare DNS API 进行 SSL 证书的自动签发和续约。Certbot 会定期检查证书是否即将过期,并在需要时自动续约,无需手动干预。