外观
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 --clearsignpowershell
[IO.File]::WriteAllText("$env:TEMP\dn42-nonce.txt", "<nonce>"); gpg --clearsign --output - "$env:TEMP\dn42-nonce.txt"⚠️ PowerShell 切勿用管道写法(
"<nonce>" | gpg):PowerShell 送进原生程序 stdin 的字节带前导 UTF-8 BOM(EF 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-autopeerpowershell
[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.com、sk-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」
- 私钥全程留在本地设备上;服务端只接触公钥与签名