Appearance
搭建文件验证服务
本文使用 Python 标准库临时提供一个验证文件,不需要安装第三方依赖。不同方式的选择和域名覆盖范围见验证方式与适用范围。
本示例用于操作引导。请根据生产环境的网络架构、软件版本、部署方式和业务要求进行适配,在测试环境验证后再使用。不要为运行示例覆盖现有业务服务或关闭安全防护。
1. 准备订单信息
在 CertCloud 订单中确认完整验证 URL,并下载对应的验证文件。下面以 http://example.com/.well-known/pki-validation/validation.txt 为例;域名、路径、文件名和内容均须替换为订单实际值。
- 确认目标域名的公网 DNS 指向实际服务入口,且验证请求可以到达该入口;有多个入口或 IPv6 时,也要逐一检查。
- 本脚本只提供 HTTP 服务。对于 HTTPS 验证,需要已有的 HTTPS 入口在 TCP 443 接收请求,并将验证路径转发给脚本。
- HTTP 验证的公网入口使用 TCP 80。脚本默认监听本机 TCP 8080,需由现有入口转发。
- CA 会从不同网络位置访问。请检查防火墙、安全组、CDN 和 WAF,并确保验证路径无需登录或交互即可读取。
2. 保存脚本
将以下内容保存为 dcv_server.py,并确认已安装 Python 3:
python
import argparse
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
from urllib.parse import urlsplit
parser = argparse.ArgumentParser(description="临时提供一个域名验证文件")
parser.add_argument("--path", required=True, help="订单验证 URL 的路径")
parser.add_argument("--file", required=True, help="下载的验证文件路径")
parser.add_argument("--host", default="0.0.0.0", help="监听地址")
parser.add_argument("--port", type=int, default=8080, help="监听端口,默认 8080")
args = parser.parse_args()
if not args.path.startswith("/") or "?" in args.path or "#" in args.path:
parser.error("--path 必须是以 / 开头且不含查询参数或片段的 URL 路径")
try:
content = Path(args.file).read_bytes()
except OSError as exc:
parser.error(f"无法读取验证文件:{exc}")
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if urlsplit(self.path).path != args.path:
self.send_error(404)
return
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.send_header("Content-Length", str(len(content)))
self.end_headers()
self.wfile.write(content)
with ThreadingHTTPServer((args.host, args.port), Handler) as server:
print(f"监听 {args.host}:{args.port},提供路径 {args.path}", flush=True)
try:
server.serve_forever()
except KeyboardInterrupt:
print("\n服务已停止")脚本启动时将文件内容读入内存,更换验证文件后需重启。它只响应指定路径的 GET 请求;其他路径返回 404。请使用订单下载的验证文件,私钥等敏感材料应单独保管。
3. 启动服务
将下面的路径替换为订单 URL 中的路径和下载的文件路径:
bash
python3 dcv_server.py \
--path '/.well-known/pki-validation/validation.txt' \
--file '/path/to/validation.txt'Windows 可将 python3 替换为 python,并使用实际的 Windows 文件路径。
如果没有现有 Web 服务,也可以在确认 TCP 80 未被占用后,直接监听公网入口:
bash
sudo python3 dcv_server.py \
--host 0.0.0.0 --port 80 \
--path '/.well-known/pki-validation/validation.txt' \
--file '/path/to/validation.txt'该命令适用于 Linux;监听 80 端口可能需要相应权限。0.0.0.0 表示监听本机所有 IPv4 地址,请结合防火墙和实际网络环境评估使用。已有业务占用 80 或 443 时,应使用现有入口转发,或由现有服务直接提供验证文件。
4. 从公网验收并提交
使用手机流量或者其它不在局域网内的设备,在浏览器上访问验证地址。确认正文与订单文件一致,没有登录页、验证码、拦截页或业务首页。有多个公网入口、CDN 或 IPv6 时,分别确认都能返回正确内容。
检查通过后,在 CertCloud 订单中发起验证。验证完成前保持脚本和验证路径可访问。
