什么是 Warrant Canary(令状金丝雀)以及如何用 GPG 验证
Warrant canary 是一份经签名、定期更新的声明,表明服务方未收到秘密法律要求。了解它的局限,以及如何用 GPG 验证 canary.txt。
简答:Warrant canary(令状金丝雀)是一份定期更新的签名声明,服务方在其中表明自己没有收到某些秘密法律要求,例如附带封口令的传票或国家安全信函。如果这份声明不再更新或措辞发生变化,读者会把这种沉默视为警告。验证方法是:用发布者的密钥指纹核对其 PGP 签名,并确认签名日期是最近的。
本文介绍金丝雀背后的法律思路、它的真实局限、一份好的金丝雀应包含什么,并以 NoctisNode 的金丝雀为例,逐步演示如何用 GPG 进行验证。
Warrant canary 的工作原理
这个名字源自矿工曾经带入井下的金丝雀:只要鸟还活着,空气就是安全的。Warrant canary 的原理与此相同。服务方发布一份带日期的声明,例如“我们未收到任何秘密法院命令或封口令”,并按固定周期更新。
这一法律思路主要起源于美国,其基础在于一个区别:当局或许能禁止公司披露其收到了秘密命令,但强迫公司发布虚假声明是另一种、也更难实现的要求。如果公司只是停止更新金丝雀,它并没有披露任何内容,但读者可以从声明的缺失中得出自己的结论。
Warrant canary 的局限
金丝雀是一个有用的信号,而不是保证。依赖它之前,请记住以下局限。
- ▹其法律理论基本未经法庭检验,不同国家的答案也可能不同。
- ▹它只涵盖明确列出的内容。关于秘密命令的金丝雀,对普通的公开法律请求只字未提。
- ▹中断的含义并不明确:可能意味着收到了法律要求,也可能只是负责人不在或出了差错。
- ▹它无法告诉你被要求了什么、何时,以及哪些客户受到影响。
- ▹它不说明存在哪些数据。请将其与清晰的日志政策结合来看;参见[无日志 VPS 详解](/blog/no-logs-vps-explained)。
- ▹它的可信度取决于签名密钥以及持有密钥的人。
一份好的 warrant canary 应包含什么
| 要素 | 为何重要 |
|---|---|
| 发布日期 | 让你一眼判断是否最新 |
| 更新周期 | 明确缺失的更新从何时起具有意义 |
| 明确的声明列表 | 读者能确切看到涵盖了哪些要求 |
| 关于中断含义的规则 | 消除猜测,例如“超过 N 天即视为信号” |
| 来自公开密钥的 PGP 签名 | 证明文本来自运营方且未被篡改 |
| 单独公布的完整密钥指纹 | 让你确认导入的是正确的密钥 |
| 固定的网址 | 便于监控和存档金丝雀 |
NoctisNode 的 warrant canary
NoctisNode 在 `/canary.txt` 发布一份经 PGP 签名的纯文本金丝雀,签名公钥位于 `/canary-pubkey.asc`,说明见 warrant canary 页面。该金丝雀每月由人工更新。如果超过 35 天未更新,请将其视为信号。
签名密钥指纹为 `3804 DA83 956F B4C1 1D87 36C3 129C E677 8F20 92E9`。务必比对完整指纹,绝不要只比对最后 8 位或 16 位字符。
逐步验证 warrant canary
以下命令适用于 Debian 12/13 和 Ubuntu 24.04。如果缺少工具,请先用 `sudo apt install gnupg curl` 安装。为了更好的隐私,你可以在安装 `tor` 和 `torsocks` 软件包后,用 `torsocks curl` 通过 Tor 获取文件。
- 01.将第 2 步和第 4 步输出的指纹与金丝雀页面及本文公布的指纹进行比对。只要有任何一个字符不同,就停止:你拿到的是错误的密钥。
- 02.在 `gpg --verify` 的输出中查找 `Good signature from`。出现 `BAD signature` 行意味着文本被篡改或文件损坏,不要信任它。
- 03.如果你没有亲自签名该密钥,出现 `WARNING: This key is not certified with a trusted signature!` 这一行是正常的。建立信任靠的是第 1 步的指纹核对。
- 04.检查 `Signature made` 日期以及金丝雀文本中写明的日期。两者都应是最近的。
- 05.如果签名已超过 35 天,请将其视为信号,并查看金丝雀页面是否有任何公告。
# 1. Download the canary and the public key
curl -fsSLO https://noctisnode.com/canary.txt
curl -fsSLO https://noctisnode.com/canary-pubkey.asc
# 2. Inspect the key without importing it
gpg --show-keys --with-fingerprint canary-pubkey.asc
# 3. Import the key
gpg --import canary-pubkey.asc
# 4. Confirm the fingerprint of the imported key
gpg --fingerprint 3804DA83956FB4C11D8736C3129CE6778F2092E9
# 5. Verify the signature on the canary
gpg --verify canary.txt自动化 35 天检查
如果你从服务器或 cron 任务监控金丝雀,请使用 GPG 的机器可读状态输出,而不是解析给人看的文本。下面的脚本会在签名缺失、来自其他密钥或超过 35 天时报错。请在包含新下载的 `canary.txt` 的目录中运行它。
#!/bin/sh
FPR=3804DA83956FB4C11D8736C3129CE6778F2092E9
line=$(gpg --status-fd 1 --verify canary.txt 2>/dev/null | grep ' VALIDSIG ')
case "$line" in
*"$FPR"*) ;;
*) echo "FAIL: no valid signature from $FPR"; exit 1 ;;
esac
ts=$(echo "$line" | awk '{print $5}')
age=$(( ( $(date +%s) - ts ) / 86400 ))
echo "Canary signature is $age days old"
[ "$age" -le 35 ] || { echo "WARNING: older than 35 days"; exit 2; }Note · 中断是需要调查的信号,而不是收到法律要求的证据。请查看金丝雀页面和运营方的公告,并自行存档以前的金丝雀副本以便比较。
常见问题
Q什么是 warrant canary?
AWarrant canary 是一份定期更新的签名声明,表明服务方未收到特定的秘密法律要求。如果它不再更新,读者会把这种沉默视为警示信号。
Qcanary.txt 是什么?
A`canary.txt` 是纯文本 warrant canary 的常用文件名,通常经过 PGP 签名,任何人都能验证是谁发布的。NoctisNode 在 `/canary.txt` 发布其金丝雀,密钥位于 `/canary-pubkey.asc`。
Q如何验证 warrant canary?
A用 `gpg --import` 导入发布者的公钥,确认完整指纹与公布的一致,然后运行 `gpg --verify canary.txt`,检查是否为有效签名且日期是最近的。
QWarrant canary 具有法律约束力或一定有效吗?
A不是。其法律理论基本未经法庭检验,且因国家而异;中断也可能只是简单的操作失误造成的。请把金丝雀视为众多信号之一。
Q如果 warrant canary 没有更新,我该怎么办?
A查看发布者的金丝雀页面和公告,与存档副本进行比较,并决定是否迁移敏感数据。对于 NoctisNode,超过 35 天未更新的金丝雀应被视为信号。