步骤 1:输入您的域名
请输入需要申请 SSL 证书的域名。支持单域名和通配符域名(如 *.example.com)。
支持格式:example.com、www.example.com、*.example.com
测试建议:首次使用请选择 "Let's Encrypt Staging",避免触发速率限制
⚠️ 生产环境每个域名每周最多申请5次,超过限制需等待7天
关于 Let's Encrypt
- 完全免费,自动化颁发
- 受所有主流浏览器信任
- 证书有效期 90 天,支持自动续期
- 支持单域名、多域名和通配符证书
📋 Staging 环境说明
Staging 环境(测试环境)用途:
- 学习和测试:无速率限制,可以无限次测试
- 流程完全相同:与生产环境的申请流程100%一致
- 证书不受信任:浏览器会显示"不安全"(这是正常的)
- 切换简单:测试成功后,切换到生产环境即可获得真实证书
💡 首次使用强烈建议先用 Staging 环境练习,避免触发速率限制
⚠️ ACME 协议重要特性
每次申请/续期证书时,验证数据都会改变:
- HTTP-01 验证:文件名和内容每次不同(CA 服务器随机生成 token)
- DNS-01 验证:TXT 记录值每次不同(基于随机 token 计算)
- 原因:这是 ACME 协议的安全设计,无法绕过
- 建议:使用 Certbot 或 acme.sh 等工具实现自动续期
💡 本工具适合首次申请或学习 ACME 流程,生产环境建议使用自动化工具
步骤 2:选择域名验证方式
请选择以下任一验证方式来证明您对域名 的所有权。
⏳ 正在获取验证数据...
步骤 3:自动验证配置
系统将自动验证您的配置是否正确。
验证信息:
📋 DNS 记录添加说明
请在您的 DNS 服务商控制台添加以下 TXT 记录:
| 完整记录名: | _acme-challenge.example.com |
| 记录类型: | TXT |
| 记录值: | xxxxx |
注意:某些 DNS 服务商可能会自动添加域名后缀,请根据实际情况调整主机记录。
例如:如果域名是 test.tannn.cn,有些服务商需要填写 _acme-challenge.test,有些需要填写 _acme-challenge.test.tannn.cn
等待开始验证...
请点击"开始验证"按钮
验证详情:
Web 服务器验证:系统会尝试通过 HTTP 访问验证文件。
DNS 验证:系统会查询 DNS TXT 记录(使用公共 DNS 服务器)。
注意:由于浏览器的 CORS 限制,HTTP 验证可能无法直接执行。DNS 验证可通过 DoH (DNS over HTTPS) 实现。
确保权限 chmod -R 755 /.well-known/acme-challenge/
DNS 查询服务:
步骤 4:选择证书格式
根据您的服务器类型,选择对应的证书格式。
步骤 5:证书安装指南
恭喜!以下是您选择的 格式的安装指南。
证书申请流程已完成!
域名:
验证方式:
证书格式:
下载证书文件
根据您选择的格式,下载相应的证书文件
⏳ 等待证书申请完成...
Let's Encrypt 证书有效期为 90 天,建议在到期前 30 天进行续期。使用 Certbot 或 acme.sh 可以自动续期。
方式 A:Web 服务器验证(HTTP-01)
通过在您的 Web 服务器上放置验证文件来证明域名所有权。适用于有公网可访问 Web 服务器的场景。
配置完成后一定要使其生效比如【nginx -s reload】重新加载nginx
⚠️ ACME 协议重要特性:
- 每次申请/续期证书时,验证文件名和内容都会改变!
- 原因:Let's Encrypt 每次生成不同的随机 token
- 这是 ACME 协议的安全设计,无法绕过
- 验证数据无法提前准备或长期保留使用
操作步骤:
-
创建验证文件目录:
mkdir -p /var/www/html/.well-known/acme-challenge -
创建验证文件:
文件名:
xxxxxxxxxxxx文件内容:
xxxxxxxxxxxx.yyyyyyyyyyyy快捷命令(复制粘贴直接执行):
echo "验证内容" > /var/www/html/.well-known/acme-challenge/验证文件名设置文件权限:
# 设置文件权限(确保 nginx/apache 用户可以读取) chmod 644 /var/www/html/.well-known/acme-challenge/* chown -R nginx:nginx /var/www/html/.well-known/ # 如果是 Apache,使用: # chown -R www-data:www-data /var/www/html/.well-known/ -
配置 Nginx(示例):
server { listen 80; server_name example.com; location /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; } }完整 Nginx 配置示例
场景 1:标准静态站点配置
server { listen 80; server_name example.com; root /var/www/html; # 确保 ACME 验证路径可访问 location /.well-known/acme-challenge/ { try_files $uri =404; } }场景 2:反向代理配置(推荐)
适用于使用 nginx 作为反向代理,所有请求都通过 proxy_pass 转发的场景
server { listen 80; server_name example.com; # ✅ ACME 验证路径 - 使用 ^~ 优先匹配,防止被其他规则拦截 location ^~ /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; } # 其他请求转发到后端 location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }⚠️ 场景 3:HTTP 自动跳转 HTTPS(最常见且易错)
很多生产环境会配置 HTTP 自动跳转到 HTTPS,这会导致 ACME 验证失败!
❌ 错误配置(会导致验证失败):
server { listen 80; server_name example.com; # ❌ 所有请求都重定向到 HTTPS,Let's Encrypt 无法访问验证文件 rewrite ^(.*) https://$server_name$1 permanent; }✅ 正确配置(推荐):
server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/example.com.pem; ssl_certificate_key /path/to/example.com.key; location / { # 你的应用配置 proxy_pass http://localhost:8080/; } } server { listen 80; server_name example.com; # ✅ ACME 验证路径(使用 ^~ 优先匹配,必须在 rewrite 之前) location ^~ /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; } # ✅ 其他请求重定向到 HTTPS(放在 location / 中) location / { rewrite ^(.*) https://$server_name$1 permanent; } }配置说明:
^~表示优先匹配,优先级高于正则和普通 location- 关键:
.well-knownlocation 必须在location /之前或使用^~提高优先级 - 只有
/.well-known/acme-challenge/路径不重定向 - 其他所有请求仍然重定向到 HTTPS
验证配置是否正确:
# 1. 创建测试文件 mkdir -p /var/www/html/.well-known/acme-challenge echo "test" > /var/www/html/.well-known/acme-challenge/test.txt # 2. 重载 nginx 配置 nginx -t && nginx -s reload # 3. 测试 HTTP 访问(应该返回 "test",HTTP 200,不应该重定向) curl -v http://example.com/.well-known/acme-challenge/test.txt # 预期结果: # < HTTP/1.1 200 OK # test # 4. 如果看到 301/302 或 https://,说明配置有问题 # 5. 如果返回 404,检查 root 路径 # 6. 清理测试文件 rm /var/www/html/.well-known/acme-challenge/test.txt场景 4:多域名共用一个服务器
多个域名可以共用同一个
/.well-known/acme-challenge/目录# 目录结构(所有域名共用) /var/www/html/.well-known/acme-challenge/ ├── abc123...xyz (example.com 的验证文件) ├── def456...uvw (blog.example.com 的验证文件) └── ghi789...rst (api.example.com 的验证文件) # Nginx 配置示例 server { listen 80; server_name example.com; location ^~ /.well-known/acme-challenge/ { root /var/www/html; try_files $uri =404; } location / { rewrite ^(.*) https://$server_name$1 permanent; } } server { listen 80; server_name blog.example.com; location ^~ /.well-known/acme-challenge/ { root /var/www/html; # 所有域名指向同一个目录 try_files $uri =404; } location / { rewrite ^(.*) https://$server_name$1 permanent; } } server { listen 80; server_name api.example.com; location ^~ /.well-known/acme-challenge/ { root /var/www/html; # 所有域名指向同一个目录 try_files $uri =404; } location / { rewrite ^(.*) https://$server_name$1 permanent; } }为什么可以共用目录?
- 验证文件名唯一:每个域名的验证文件名都是随机生成的(如
abc123xyz...),不会冲突 - 每次申请文件名都不同:同一域名每次申请/续期证书时,Let's Encrypt 都会生成新的随机文件名
- Let's Encrypt 只访问对应域名的文件:申请
example.com证书时,只会访问http://example.com/.well-known/acme-challenge/abc123xyz - 简化管理:所有验证文件放在同一个目录,便于统一管理和清理(建议定期清理旧的验证文件)
-
配置 Apache(示例):
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/html <Directory "/var/www/html/.well-known/acme-challenge"> Require all granted </Directory> </VirtualHost> -
配置 Tomcat(示例):
将
.well-known目录放在 webapp 根目录下,确保可以通过 HTTP 访问。 -
重启 Web 服务器:
# Nginx sudo systemctl reload nginx # Apache sudo systemctl reload apache2 # Tomcat # 重启 Tomcat 服务 -
验证配置是否正确(重要步骤):
# 1. 检查 Nginx 配置语法 nginx -t # 2. 如果语法正确,重新加载配置 nginx -s reload # 3. 确认验证文件存在且可读 ls -la /var/www/html/.well-known/acme-challenge/验证文件名 # 4. 测试 HTTP 访问(应该返回文件内容,不应该是 301/302 重定向) curl -v http://example.com/.well-known/acme-challenge/验证文件名 # 预期结果: # < HTTP/1.1 200 OK # 验证文件内容... # # ⚠️ 如果看到 301/302 或 https://,说明被重定向了,需要修改 Nginx 配置 # ⚠️ 如果返回 404,检查 root 路径是否正确 # ⚠️ 如果返回 403,检查文件权限 # 5. 如果遇到问题,查看 Nginx 错误日志 tail -f /var/log/nginx/error.log
注意事项:
- 确保域名已正确解析到服务器 IP
- 确保防火墙开放 80 端口
- 验证文件需要通过 HTTP(非 HTTPS)访问
- 验证文件无需扩展名
- 每次申请/续期:验证文件名和内容每次都不同,需要重新创建验证文件
- 多域名场景:多个域名可以共用同一个
/.well-known/acme-challenge/目录,因为每个域名的验证文件名都是唯一的随机字符串,不会冲突 - 目录权限:确保 nginx/apache 用户对
/.well-known/acme-challenge/目录有读取权限chmod -R 755 /.well-known/acme-challenge/ - 自动化建议:推荐使用 Certbot 或 acme.sh 等工具实现自动续期,避免手动操作
方式 B:DNS 解析验证(DNS-01)
通过在域名的 DNS 解析中添加指定的 TXT 记录来证明域名所有权。适用于无法配置 Web 服务器或需要通配符证书的场景。
操作步骤:
-
登录域名管理控制台:
访问您的域名注册商或 DNS 服务商控制台(如阿里云、腾讯云、CloudFlare 等)
-
添加 TXT 记录:
记录类型: TXT主机记录: _acme-challenge记录值: xxxxxxxxxxxxxxxxxxxxxxxxxxxxTTL: 600(10分钟,或更短) -
完整记录示例:
_acme-challenge.example.com IN TXT "验证字符串"💡 注意:主机记录需要填写完整的
_acme-challenge.example.com
有些DNS服务商可能只需要填写_acme-challenge(自动补全域名),请根据实际情况调整。 -
等待 DNS 解析生效:
通常需要 1-10 分钟,具体时间取决于您的 DNS 服务商。
-
验证 DNS 记录:
使用以下命令验证 TXT 记录是否生效:
# Linux / macOS dig _acme-challenge.example.com TXT # Windows nslookup -type=TXT _acme-challenge.example.com # 在线查询 # 访问 https://dnschecker.org/
⚠️ ACME 协议重要特性:
- 每次申请/续期证书时,TXT 记录值都会改变!
- 原因:Let's Encrypt 每次生成不同的随机 token
- 这是 ACME 协议的安全设计,无法绕过
- 验证数据无法提前准备或长期保留使用
其他注意事项:
- DNS 验证支持通配符证书(如 *.example.com)
- 确保 TXT 记录的值用双引号包裹
- 不同 DNS 服务商的解析生效时间不同(通常 1-10 分钟)
- 可以保留 TXT 记录名称(_acme-challenge),续期时只需修改记录值
- 如果域名使用了 CDN,注意 DNS 缓存问题
- 建议使用 Certbot 或 acme.sh 等工具实现自动续期