申请 Let's Encrypt 证书 ( Cloudflare DNS + 无需 80 端口 + 自动续签)

在 Ubuntu 服务器上申请 Let’s Encrypt 证书 ( Cloudflare DNS + 无需 80 端口 + 自动续签),核心原理为dns-01 验证,回避http-01验证以避免80端口冲突。域名 为aaa.xxxxxx.xyz(根据实际替换为自己的域名)。

##步骤 1: 连接服务器并安装 Certbot :
sudo apt update
sudo apt install certbot

##步骤 2: 安装 Cloudflare DNS 插件,提供了 Certbot 与 Cloudflare API 集成的功能:
sudo apt install python3-certbot-dns-cloudflare

##步骤 3: 在 Cloudflare 获取 API 凭证并安全配置到服务器
(1)api获取方式一(推荐使用 API Token,权限更安全)。
1.登录 Cloudflare 账号,进入仪表板。
2.点击右上角个人头像,选择 “My Profile” 。
3.在左侧菜单选择 “API Tokens” (API 令牌)。
4.点击 “Create Token” (创建令牌)——get started。
5.选择 “Create Custom Token” (创建自定义令牌)。
6.给令牌起一个容易识别的名字(例如:certbot-xxxxxx.xyz-dns)。
A. Permissions (权限):
Zone -> DNS -> Edit (编辑)
Zone -> Zone -> Read (读取)
B.Zone Resources (区域资源):
Include (包含): Specific zone (特定区域) -> 选择 xxxxxx.xyz (主域名)。
#解释:Cloudflare 以根域名 xxxxxx.xyz 管理区域,此处注意将子域名aaa去掉只保留根域名。选择这个区域的权限就包含了管理其下所有子域名(包括 aaa.xxxxxx.xyz)的 DNS 记录的权限。
C.Client IP Address Filtering (客户端 IP 地址过滤): (可选但推荐)可以选择添加Ubuntu 服务器的公网 IP 地址,这样这个令牌就只能从自己的服务器上使用(is in=IP地址)。
D.TTL: (可选)设置令牌有效期,点击选择开始和结束时间,尽量把时间弄长点。
E.点击 “Continue to summary” (继续到摘要) -> “Create Token” (创建令牌)。Cloudflare 会显示生成的 API Token,请立即复制并妥善保存它,这个令牌只会在创建时显示一次。
(2)api获取方式二(不推荐,权限过大),获得Cloudflare Global API Key。
1.登录 Cloudflare 账号。
2.点击右上角个人头像,选择 “My Profile”。
3.在左侧菜单选择 “API Tokens”。
4.向下滚动找到 “Global API Key” (全局 API 密钥) 部分。
5.点击 “View” (查看)。需要输入密码和可能的人机验证。
6.复制显示的 Global API Key。

#编辑配置文件,推荐放在 /etc/letsencrypt/ 下:
sudo micro /etc/letsencrypt/cloudflare.ini
#如果是方式一获取的apikey,粘贴入以下内容:
dns_cloudflare_api_token = YOUR_PASTED_API_TOKEN_HERE #替换为dnskey
#如果使用的是第二种Global API Key,文件内容如下:
dns_cloudflare_email = [email protected] #替换为实际邮箱
dns_cloudflare_api_key = YOUR_PASTED_GLOBAL_API_KEY_HERE #替换为全局key
#设置文件所有者为root
sudo chown root:root /etc/letsencrypt/cloudflare.ini
#设置文件权限为 600 (只有root用户可读写)
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

##步骤 4: 使用 Certbot 申请证书,将 [email protected]替换为实际邮箱

1
2
3
4
5
6
7
sudo certbot certonly \
--authenticator dns \
--dns-plugin cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d aaa.xxxxxx.xyz \
--non-interactive --agree-tos -m your_email@example.com \
--no-eff-email

命令解释:sudo certbot certonly: 运行 Certbot,只获取证书文件,不安装到 Web 服务器;–authenticator dns: 指定使用 DNS 验证方式;–dns-plugin cloudflare: 指定使用 Cloudflare DNS 插件;–dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini: 指向包含 Cloudflare API 凭证的文件;-d aaa.xxxxxx.xyz: 指定需要申请证书的域名;–non-interactive: 以非交互模式运行;–agree-tos: 自动同意 Let’s Encrypt 的服务条款;-m [email protected]: 提供电子邮件地址;–no-eff-email: 防止 Certbot 询问是否分享邮件给 EFF。显示如下内容即成功,并且自动续签任务也已配置好。
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/aaa.xxxxxx.xyz/fullchain.pem
Key is saved at: /etc/letsencrypt/live/aaa.xxxxxx.xyz/privkey.pem
This certificate expires on YYYY-MM-DD.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

##步骤 5: 验证自动续签是否正常工作
sudo certbot renew –dry-run
systemctl status certbot.timer

##步骤 6: 找到并使用证书文件,SSL 证书文件和私钥文件保存在以下目录中:
/etc/letsencrypt/live/aaa.xxxxxx.xyz/
/etc/letsencrypt/live/aaa.xxxxxx.xyz/fullchain.pem: 这是域名证书和 Let’s Encrypt 中间证书的合并文件。在配置 Web 服务器 (Nginx, Apache) 或其他服务时,通常需要指定这个文件作为 SSL 证书文件。
/etc/letsencrypt/live/aaa.xxxxxx.xyz/privkey.pem: 这是证书私钥文件,在配置服务时需要指定这个文件作为私钥文件。
以后安装 Web 服务器(如 Nginx 或 Apache)或其他需要启用 HTTPS 的服务时,在其配置文件中找到 SSL/TLS 相关的部分,并指定这两个文件的完整路径即可。

##排错纠错
命令找不到或权限问题: 确保使用了 sudo,并且 Certbot (/usr/bin/certbot) 已经通过 apt 安装。
Certbot 申请或续签失败: 凭证文件问题: 这是最常见原因。仔细检查 /etc/letsencrypt/cloudflare.ini 文件名、路径、内容格式、凭证本身是否正确,以及文件权限是否是 600。
Cloudflare API 权限问题: 确认在 Cloudflare 创建的 API Token(或 Global Key)拥有编辑 xxxxxx.xyz 区域 DNS 记录的权限。
DNS 插件未安装: 确认 sudo apt install python3-certbot-dns-cloudflare 成功执行。
服务器时间问题: 确保服务器时间是准确的,时间不同步可能导致验证失败。使用 date 命令查看时间,并考虑安装 ntp 服务进行时间同步(sudo apt install ntp)。


申请 Let's Encrypt 证书 ( Cloudflare DNS + 无需 80 端口 + 自动续签)
http://example.com/2025/05/13/申请 Let's Encrypt 证书 ( Cloudflare DNS + 无需 80 端口 + 自动续签)/
Author
John Doe
Posted on
May 13, 2025
Licensed under