Skip to content

ASN 归属验证:签名指南

登录 auth.natlan.io(NATLAN 的 DN42 身份服务)时,需要证明你控制目标 ASN。页面会给出一个一次性随机字符串(nonce),你用 DN42 registry 中 mntner auth: 行登记的密钥对它签名,把签名粘贴回页面即可。本文给出各方式的具体命令、判定标准与常见报错。

通用规则:

  • nonce 形如 dn42-autopeer:4242420028:B5ha12fyDmZ3ty…15 分钟内有效,答案最多尝试 5 次,超限需重新发起
  • 签名必须出自 registry 中该 mntner 登记的那把钥匙——用别的钥签一律拒绝
  • nonce 尾部多一个换行没关系(echo 不带 -n 的手滑已被容忍),但不要改动 nonce 本身的任何字符
  • 命令里的 <nonce> 用页面「待签名字符串」的复制按钮原样粘入

邮箱验证码

最简单的方式:系统向 registry 登记邮箱发送 6 位验证码,收到后填回页面。重发有 60 秒冷却;冷却期内重复请求会复用同一条验证码(页面会提示),请查收之前的邮件而不要连点。

PGP 签名

签名命令

💡 授权页「复制」按钮旁的 可直接复制已填好 nonce 的完整命令,无需手工替换。

sh
printf %s "<nonce>" | gpg --clearsign
powershell
[IO.File]::WriteAllText("$env:TEMP\dn42-nonce.txt", "<nonce>"); gpg --clearsign --output - "$env:TEMP\dn42-nonce.txt"

⚠️ PowerShell 切勿用管道写法"<nonce>" | gpg):PowerShell 送进原生程序 stdin 的字节带前导 UTF-8 BOMEF BB BF),被签明文变成 <nonce>,服务端必然拒绝;改 $OutputEncoding 也无效。用上面的写文件命令可产出精确字节。

机器上有多把钥匙时,用 --local-user <登记指纹> 明确指定 registry 登记的那把。

完整输出粘贴回页面——从 -----BEGIN PGP SIGNED MESSAGE----------END PGP SIGNATURE-----,包含首尾标记行。

判定标准

  • 签名主钥指纹必须等于 registry auth: pgp-fingerprint <指纹> 登记值;子钥签名可以(会映射回主钥判定),但主钥必须是登记那把
  • 被签明文必须逐字节等于 nonce

补交公钥

服务端核验前需要拿到公钥,按序尝试三处:registry 的 key-cert 对象 → keys.openpgp.org → 随签名一并提交。前两处都取不到(或取到的不可用)时,页面会展开公钥输入框,此时导出并粘贴:

sh
gpg --armor --export <登记指>

务必带指纹参数——裸 gpg --export 会把钥匙串里的其他钥匙也导出来,服务端按指纹比对会拒绝。

注意:keys.openpgp.org 在你完成邮箱验证之前只发布剥掉 User ID 的裸公钥,而 gpg 拒绝导入无 UID 的钥。所以「我明明上传过公钥」也可能仍被要求补交,属预期行为。

SSH 签名

签名命令

💡 授权页「复制」按钮旁的 可直接复制已填好 nonce 的完整命令,无需手工替换。

sh
printf %s "<nonce>" | ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n dn42-autopeer
powershell
[IO.File]::WriteAllText("$env:TEMP\dn42-nonce.txt", "<nonce>"); ssh-keygen -Y sign -f $env:USERPROFILE\.ssh\id_ed25519 -n dn42-autopeer "$env:TEMP\dn42-nonce.txt"; Get-Content "$env:TEMP\dn42-nonce.txt.sig"

Windows 10+ 系统自带 OpenSSH,PowerShell 命令开箱即用。给 ssh-keygen -Y sign 传文件时签名会写到 <文件>.sig,末尾的 Get-Content 就是把它显示出来供复制。同样切勿用管道写法——PowerShell 管道会给 stdin 加前导 UTF-8 BOM,签出来的内容必被拒(见上方 PGP 一节的说明)。

  • -f 指向 registry 登记公钥对应的私钥文件,路径按实际调整
  • -n dn42-autopeer 必须原样保留——这是 SSHSIG 的 namespace 域分离机制,签错 namespace 的签名在本流程无效(也保证本流程的签名不能被挪用到别处)

把完整的 -----BEGIN SSH SIGNATURE----- 块粘贴回页面。

判定标准与支持范围

  • 签名内嵌公钥必须与 registry auth: 行登记的公钥逐字节一致
  • 支持 ed25519、RSA(rsa-sha2-256/512)、ECDSA(nistp256/384/521)
  • FIDO/U2F 硬件钥(sk-ssh-ed25519@openssh.comsk-ecdsa-sha2-nistp256@openssh.com)同样支持,签名时按提示触摸钥匙。免触摸(no-touch-required)的签名会被拒——与 ssh-keygen -Y verify 的默认判定一致

常见报错对照

页面提示原因与处理
签名校验未通过签名内容或 nonce 被改动,或用了未登记的钥匙;重新复制 nonce 原样签一次
被签内容与待签字符串不符典型原因:Windows PowerShell 用了管道写法,stdin 被加上不可见的 UTF-8 BOM;改用本文/授权页「复制 ▾」的写文件命令
该签名来自另一把密钥签字的钥匙不是 registry 登记那把;PGP 用 --local-user <指纹>,SSH 检查 -f 路径
签名参数不对(namespace)SSH 签名漏了或改了 -n dn42-autopeer;用页面/本文的完整命令
签名格式不完整粘贴时丢了首尾标记行;重新完整复制整块输出
请一并粘贴公钥服务端自动取钥失败(见补交公钥);gpg --armor --export <指纹>
粘贴的公钥与登记指纹不符导出了别的钥匙;导出命令必须带登记指纹参数
验证已超时nonce 过了 15 分钟有效期;回上一步重新发起

安全说明

  • 签名只用于一次性归属证明:nonce 含用途前缀与 ASN,高熵随机、单次有效,无法被重放到其他场景
  • 完成验证不会授予任何系统权限,只是向你正在登录的第三方应用证明「此人控制该 ASN」
  • 私钥全程留在本地设备上;服务端只接触公钥与签名