开发者平台 · 2 / 9

准备签名工具与发布密钥

cdnca-plugin 是单个离线可执行文件,只处理本地文件,不登录平台、不代替上传与审核。一把发布密钥长期使用,不要每个版本重新生成。

← 全部教程

下载并校验

选择与你的系统对应的文件,同时下载 SHA256SUMS;先只取出目标文件那一行再校验,哈希不一致就停下,不要运行。

CDNCA_DOWNLOADS='https://developer.cdnca.com/downloads/cdnca-plugin'
CDNCA_CLI_FILE='cdnca-plugin-linux-amd64'   # ARM64: cdnca-plugin-linux-arm64
curl --fail --location --show-error --output "$CDNCA_CLI_FILE" "$CDNCA_DOWNLOADS/$CDNCA_CLI_FILE" &&
curl --fail --location --show-error --output SHA256SUMS "$CDNCA_DOWNLOADS/SHA256SUMS" &&
awk -v name="$CDNCA_CLI_FILE" '$2 == name { print; found=1 } END { if (!found) exit 1 }' SHA256SUMS > SHA256SUMS.selected &&
sha256sum -c SHA256SUMS.selected &&
chmod +x "$CDNCA_CLI_FILE" &&
CDNCA_PLUGIN_CLI="$(pwd -P)/$CDNCA_CLI_FILE"
CDNCA_DOWNLOADS='https://developer.cdnca.com/downloads/cdnca-plugin'
CDNCA_CLI_FILE='cdnca-plugin-darwin-arm64'
curl --fail --location --show-error --output "$CDNCA_CLI_FILE" "$CDNCA_DOWNLOADS/$CDNCA_CLI_FILE" &&
curl --fail --location --show-error --output SHA256SUMS "$CDNCA_DOWNLOADS/SHA256SUMS" &&
awk -v name="$CDNCA_CLI_FILE" '$2 == name { print; found=1 } END { if (!found) exit 1 }' SHA256SUMS > SHA256SUMS.selected &&
shasum -a 256 -c SHA256SUMS.selected &&
chmod +x "$CDNCA_CLI_FILE" &&
CDNCA_PLUGIN_CLI="$(pwd -P)/$CDNCA_CLI_FILE"
$CdncaDownloads = 'https://developer.cdnca.com/downloads/cdnca-plugin'
$CdncaFile = 'cdnca-plugin-windows-amd64.exe'
Invoke-WebRequest "$CdncaDownloads/$CdncaFile" -OutFile $CdncaFile -ErrorAction Stop
Invoke-WebRequest "$CdncaDownloads/SHA256SUMS" -OutFile SHA256SUMS -ErrorAction Stop
$CdncaSumLines = @(Select-String -Path SHA256SUMS -Pattern '^[a-f0-9]{64}\s+\*?cdnca-plugin-windows-amd64\.exe#x27;)
if ($CdncaSumLines.Count -ne 1) { throw 'SHA256SUMS has no unique line for this file' }
$CdncaExpected = ($CdncaSumLines[0].Line -split '\s+')[0]
if ((Get-FileHash $CdncaFile -Algorithm SHA256).Hash.ToLower() -ne $CdncaExpected) { throw 'hash mismatch' }
$CdncaPluginCli = (Resolve-Path $CdncaFile).Path

后面的命令以 Linux/macOS 为例。Windows 用相同的子命令和参数,在 PowerShell 里写成 & $CdncaPluginCli <子命令> …。工具只有四个子命令:keygen、pubkey、sign-challenge、sign-manifest;出错退出 1,用法错误退出 2。

生成一次发布密钥

私钥放在工程目录之外,不要提交到 Git、上传平台或发给客户。

CDNCA_KEY_DIR="$HOME/.config/cdnca-publisher"
mkdir -m 700 -p "$CDNCA_KEY_DIR"
CDNCA_PUBLISHER_KEY="$CDNCA_KEY_DIR/publisher.key"

"$CDNCA_PLUGIN_CLI" keygen -out "$CDNCA_PUBLISHER_KEY"
"$CDNCA_PLUGIN_CLI" pubkey -key "$CDNCA_PUBLISHER_KEY"

keygen 不会覆盖已有文件,私钥权限为 0600,并在标准输出打印公钥;之后随时可以用 pubkey 再打印。私钥丢失无法恢复,只能登记新公钥,请备份到受控位置。

登记公钥并认领命名空间

  1. 卖家站“发布者公钥”→“登记公钥”,填命名空间和上一步的公钥,点“获取待签名内容”。
  2. 复制页面上完整的“待签名内容(base64url)”,原样填进下面命令,不要自行解码或拼接。
  3. 把输出粘贴到“签名(base64url)”,点“提交登记”。
"$CDNCA_PLUGIN_CLI" sign-challenge \
  -key "$CDNCA_PUBLISHER_KEY" \
  -message '<message-from-the-page>'
规则取值
命名空间3–96 个字符,小写字母和数字,用点或连字符分段,例如 com.example
保留命名空间io.cdnca 只给平台官方
挑战有效期15 分钟,只能用一次;过期重新获取
谁能登记只有主账号

工具会先确认这段内容确实是平台为这把公钥签发的挑战,否则拒绝签名,私钥不会被拿去签别的东西。首次登记成功即认领命名空间。怎样确认:公钥列表里出现该命名空间和状态有效的公钥。

给清单签名

"$CDNCA_PLUGIN_CLI" sign-manifest \
  -key "$CDNCA_PUBLISHER_KEY" \
  -in manifest.json \
  -out manifest.signed.json
  • 工具把清单规范化、计算摘要,写入 integrity(Ed25519、key_id、payload_sha256、signature);已有的 integrity 会被替换。
  • metadata.publisher.id 必须是你已认领的命名空间,key_id 必须是该命名空间下有效的公钥。
  • 清单只允许对象、数组和字符串,出现数字、布尔值或 null 会报错。这个限制只针对清单,不影响主题、规则或配置模型里模型允许的数字和布尔值。
  • 签名后再改清单任何字段都要重新签名。签名只证明发布者和字节完整,不代替内容扫描和功能测试。