签名密钥
IronFlock 会为设备和 Appliance 安装的所有内容签名。每台设备和每台 Appliance 在运行或使用所下载的内容之前,都会用自己已持有的密钥检查其签名。本页列出这些密钥、每个密钥签名的内容,以及如何更换(轮换)密钥,而不会让任何设备或 Appliance 无法检查其下一次更新。
密钥列表
| 密钥 | 签名对象 | 检查方 |
|---|---|---|
IronFlock Appliance Release — OpenPGP,RSA 4096,指纹 8B37 990C 2980 0418 4664 75B8 D8E6 DD6C 025B B56D | Appliance 安装程序、可用版本列表,以及每个版本的发布清单(其文件的校验和及其所有容器镜像的标识) | Appliance 上的 ironflock-update 和安装程序 |
IronFlock Bootstrap — OpenPGP,RSA 4096,指纹 F6C9 4D96 CE31 5377 ACA7 C8EA 4990 5433 7321 2788 | 设备安装程序 install.sh、其版本文件以及 ironflock-init 程序 | 设备上的 install.sh |
设备代理程序更新 — 两个 Ed25519 密钥,ID 为 4193db1f 和 2b040fcf | 设备代理程序更新,以及代理程序下载的远程访问客户端 | 设备代理程序和 ironflock-init |
IronFlock Code Signing Root — X.509,RSA 4096,SHA-256 指纹 1D:F4:F2:EC:32:E3:FF:2E:9E:CD:89:7E:92:F9:16:4C:C1:8A:CE:CF:96:DE:E8:55:7A:3F:5D:95:9E:8B:DB:69,有效期至 2036 年 7 月 | 仅下方 Windows 签名者的证书,不签署其他任何内容 | Windows 上的设备代理程序 |
IronFlock Device Agent (Windows 签名者) — Authenticode,RSA 4096,证书序列号 D137272B35F0ED5211219674E8B052B4,由代码签名根证书签发,有效期至 2036 年 6 月 | Windows 版设备代理程序及其远程访问客户端 frpc.exe | Windows 上的设备代理程序,作为更新签名之外的额外检查;从代理程序 1.5.6 版本起,未通过此检查的文件会被拒绝 |
两个 OpenPGP 密钥都可以下载下来进行手动检查:Appliance 密钥位于 https://instance-registry.ironflock.com/dl/appliance/appliance-release.asc(参见首次安装前验证安装程序),引导密钥位于 https://instance-registry.ironflock.com/dl/device-init/ironflock-bootstrap.asc(参见可选:先验证安装程序)。请将 gpg 报告的指纹与本页列出的指纹进行比较。设备代理程序的密钥内置在代理程序中,无需手动检查。
在 Windows 上,设备代理程序会用其内置的代码签名根证书检查它下载的每一个更新和每一个 frpc.exe:文件必须带有由该根证书签发的签名者证书所做的有效签名。从 1.5.6 版本起,未通过检查的文件会被删除,不会运行;1.5.4 和 1.5.5 版本只记录该失败。签名者证书按检查时的时间进行检查,因此时钟超出证书有效期的 Windows 设备,在其时钟正确之前不会更新。代理程序每次启动时还会检查自身的可执行文件,并将 codesign: self-check passed 或 codesign: self-check FAILED 写入其日志 C:\ProgramData\IronFlock\DeviceAgent\device-agent.log;记录了 FAILED 的设备会拒绝与其所运行的代理程序以相同方式签名的更新。
代理程序的安装程序还会将代码签名根证书添加到计算机的受信任根证书中。代理程序的检查并不需要它在那里,因此在安装程序开始这样做之前安装的设备,也以同样的方式检查其更新。要确认它就是本页列出的根证书,请在 PowerShell 中运行 Get-ChildItem Cert:\LocalMachine\Root | Where-Object Subject -like '*IronFlock Code Signing Root*' | Format-List Subject, Thumbprint, NotAfter;指纹(Thumbprint)必须为 6083E7E2446B8C95A6F6B2E3CFE354AE02859196。当受信任根证书中有该根证书时,Get-AuthenticodeSignature "$env:ProgramData\IronFlock\DeviceAgent\device-agent.exe" | Select-Object Status, @{ n = 'Serial'; e = { $_.SignerCertificate.SerialNumber } } 会显示 Valid;Windows 会在序列号前加上 00,写作 00D137272B35F0ED5211219674E8B052B4。1.5.4 之前版本的设备代理程序,以及 frp 0.71.1 及更早版本的 frpc.exe,带有由同一根证书签发的上一个 Windows 签名者证书,序列号为 481360741E254378C38A5236940BFFA44CFDD809。它不再用于签署任何新内容;在该证书于 2028 年 10 月到期之前,代理程序都接受其签名。
密钥的保管方式
- 本页列出的密钥均无法导出,代码签名根证书除外。其私钥保存在 IronFlock 的密钥管理系统中,签名也在那里进行。代码签名根证书不签署任何软件,只签署 Windows 签名者的证书;它的密钥仅在更换该证书时使用。
- 发布版本由各自的发布流水线签名。某个产品的发布版本所用的签名密钥,只能由该产品的自动化发布流程在其检查和测试通过后使用。
- 设备代理程序信任两个相互独立的密钥。新的发布版本使用第一个密钥签名。第二个密钥签署了更早的发布版本,并且仍以手动方式为只信任该密钥的旧版代理程序和旧版
ironflock-init签署更新。此外,它还留作第一个密钥无法再使用时的备用;届时更新改用它签名,因此设备无需任何会跳过检查的设置即可继续更新。
轮换密钥
密钥会在达到其计划使用期限时更换;如果怀疑密钥已泄露,则会立即更换。本节讲的是上述签名密钥;Appliance 自身的内部机密信息使用 ironflock-update --rotate 更换,参见主机上的机密信息。轮换始终分三个步骤进行,以便每台设备和 Appliance 在此过程中都能检查每一次更新:
- 加入新密钥。某个发布版本会把新密钥加入设备或 Appliance 所信任的密钥中。该发布版本仍使用当前密钥签名,因此所有更新到该版本的设备和 Appliance 都会接受它。
- 签名切换到新密钥。一旦现场的系统都已运行信任两个密钥的发布版本,IronFlock 就改用新密钥签名。在此期间,旧密钥仍然受信任。
- 停用旧密钥。之后的某个发布版本会移除旧密钥。从那时起,旧密钥的签名将被拒绝,该密钥会列在已停用的密钥下。
对各个密钥而言,这意味着:
- Appliance 发布密钥。Appliance 信任其
ironflock-update中内置的密钥,因此 Appliance 必须先安装第 1 步中的发布版本,才能检查在第 2 步中签名的更新。在整个过渡期内都未更新的 Appliance 会在发生任何变更之前中止更新;请按照首次安装前验证安装程序中的说明,用新密钥验证安装程序,然后手动运行一次。 - 设备代理程序更新密钥。设备信任其所运行的代理程序中内置的密钥。在整个过渡期内都处于离线状态的设备无法检查用新密钥签名的更新;请使用信任新密钥的设备安装程序重新安装其代理程序。
- 引导密钥。
install.sh在每次安装时都会重新下载,并自带用于检查的密钥,因此新密钥会随下一个安装程序发布版本生效,无需过渡期。唯一的变化在于手动检查:请与本页上的指纹进行比较。 - Windows 代码签名。Windows 设备信任的是代码签名根证书,而不是签名者。由同一根证书签发的新签名者证书随下一个发布版本生效,无需过渡期,也无需在设备上进行任何操作。由于代理程序按检查时的时间检查签名者证书,用已到期的证书签名的文件会被拒绝;因此签名者证书会在到期之前很早就更换。根证书本身会在 2036 年 7 月到期之前很早就按上述三个步骤更换;在整个过渡期内都处于离线状态的 Windows 设备需要重新安装其代理程序。计算机的受信任根证书中会保留安装程序添加的根证书,因此在根证书轮换之后,上面的 PowerShell 检查可能只显示之前的根证书;代理程序是对照其内置的根证书进行检查的。
在过渡期内,本页会列出两个密钥及其指纹,发布说明也会公告每一个步骤。对于保持最新的 Appliance 或设备,无需执行任何操作。
如果密钥泄露,IronFlock 会立即停止使用它签名,按上述流程在短时间内完成轮换,并发布一份安全公告。
已停用的密钥
目前还没有。