OPENAPI AUTHENTICATION
使用 API 凭证接入。
程序使用 Access Key 和 Secret Key 访问已发布的 CDN OpenAPI。账户网页继续通过浏览器会话访问;资金、实名审批和平台管理不开放给 API 凭证。
请求头
X-CDN-AK: <Access Key> X-CDN-Timestamp: <UTC 秒时间戳> X-CDN-Nonce: <随机小写十六进制 nonce> X-CDN-Signature: <HMAC-SHA256 小写十六进制签名>
时间偏差最多 300 秒。每个请求生成新的 nonce:至少 16 个随机字节,小写十六进制长度为 32–128 且为偶数;服务端保留 10 分钟以拒绝重放。
签名原文
METHOD PATH SORTED_CANONICAL_QUERY SHA256_BODY TIMESTAMP NONCE
六个字段之间使用 LF 换行,末尾没有换行。METHOD 必须是大写。对实际发送的 body 字节计算 SHA-256;空 body 也要计算摘要。Secret Key 先从无填充 base64url 解码为 32 字节,再作为 HMAC-SHA256 密钥使用。
PATH 按路径段解码并按 RFC3986 重新编码,UTF-8 百分号编码使用大写十六进制。拒绝编码后的斜线、反斜线、重复斜线、点路径段及控制字符。不要使用会自动消除点路径段的 URL 处理结果替代原始输入检查。
Query 解码后按 RFC3986 编码,按编码后的 key、value 依次排序。重复参数和同值重复项均保留,裸参数归一为 key=。空格写成 %20,字面加号写成 %2B;原始加号、分号、井号、空 & 分段和非法转义会被拒绝。
公开合成向量
仓库的 tests/fixtures/signing/hmac-v1.json 提供 Go 与 TypeScript 共用的六组固定向量,涵盖空 body、Unicode、重复 Query 和保留字符。向量使用公开合成密钥字节 0–31 与历史时间戳,仅用于验证算法,不能作为运行凭据。
TypeScript 实现在 apps/web/src/lib/openapi-signing.ts。调用 signRequest 时传入实际请求的方法、路径、原始 Query、body 和本次时间戳、nonce;不要对 body 再做格式化或重新排序后发送。
轮换与撤销
创建或轮换时仅展示一次 Secret Key。轮换保持 Access Key 不变,旧 Secret Key 立即失效,没有宽限期。撤销不可恢复,已过期凭证不能延长或轮换。
创建或轮换响应因网络中断而不明确时,先查看最新状态,避免自动重试;无法恢复已交付的 Secret Key 时,可以使用最新版本主动轮换。
管理 API 凭证