PocketRoles · 安全机制
代码签名政策
我们发布的文件带有哪些签名、还没有哪些签名、你自己怎么核对。这里写的都是现在的真实情况。
现在的状态
- 发布文件的清单(
SHA256SUMS.txt)带有作者的签名(从 v0.5.5 起)。 - Aegis 的定义文件带有作者的签名。签名不符的文件不会被使用。
- exe 等程序还没有 Windows 的代码签名(发布者证书)。第一次打开时,Windows 会显示蓝色的警告。
什么是代码签名?
它是附在文件上的一个“记号”,用来确认“是谁做的”和“之后有没有被改过”。
和 PocketRoles 有关的签名有 2 种。
- 用作者密钥做的签名已有
用 PocketRoles 自己生成的密钥。发布文件的清单和 Aegis 的定义文件都有这个签名。 - Windows 的代码签名(Authenticode)还没有
由发证书的公司核实发布者之后,附在程序上。有了它,Windows 就能显示“发布者”,蓝色警告也会少很多。
现在已签名的东西
发布文件的清单(SHA256SUMS.txt)
从 v0.5.5 起,GitHub Releases 的每个发布都附带下面 4 个文件。
| 文件 | 内容 |
|---|---|
PocketRoles-<版本>.zip | 模组本体 |
PocketRoles-Setup-<版本>.zip | 启动器 |
SHA256SUMS.txt | 上面 2 个文件的指纹(SHA-256)清单 |
SHA256SUMS.txt.sig | 作者对这份清单的签名 |
“指纹”就是 SHA-256 哈希值。文件哪怕只改了 1 个字节,指纹也会变。
清单里有一行 # release=<版本>,所以旧发布的清单不能拿来冒充新发布的。同一个版本也不会用不同的内容重新签名:作者的电脑上留有“签过哪个版本、内容是什么”的记录,工具会拒绝。
SHA256SUMS.txt 长这样。
# format=PocketRoles.Release.Sums.v1
# release=0.5.5
<64 个字符的指纹> PocketRoles-0.5.5.zip
<64 个字符的指纹> PocketRoles-Setup-0.5.5.zip
Aegis 的定义文件(aegis/definitions.txt)
里面是作弊检测规则、NG 词、共享限制进入名单等。模组和 Aegis 的托盘程序会自动从 GitHub 获取。
这个文件也用同一把密钥签名(definitions.txt.sig)。
模组和托盘程序只使用签名相符的文件。没有签名、签名不符、用已作废的密钥签名、比正在使用的版本旧——只要有一条,就不使用那个文件,而是使用程序内置的值(以及之前核对过并保存的文件)。
结果可以在托盘程序的扫描画面(“签名 OK”)和模组的 /ac rules 里看到。
签名密钥
- 方式
- RSA 3072 位 / SHA-256
- keyid
91400fdf0f5af4ca— 公钥指纹(SHA-256)的前 16 位。.sig文件的第 2 行写着keyid=91400fdf0f5af4ca。- 私钥
- 只在作者的电脑上(有密码保护),另有 1 份备份放在不联网的地方。GitHub 上没有,自动构建里也没有。
- 公钥
- 在模组和托盘程序的程序里(源代码中是
src/Net/AegisRules.cs和aegis/Aegis.ps1)。 - 密钥泄露时
- 换新密钥,并发布把旧密钥列入“已作废密钥”的版本。之后用已作废密钥签名的文件都不会被使用。
还没有签名的东西
现在发布的文件(启动器的 .cmd 和 .ps1、模组的 DLL),以及正在制作的 exe 启动器,都没有 Windows 的代码签名。
所以第一次打开时会出现蓝色画面“Windows 已保护你的电脑”(SmartScreen)。它的意思是“无法确认发布者”,不是“发现了病毒”。要打开,请点“更多信息”→“仍要运行”。
不放心的话,打开之前先按下面的“核对方法”检查文件。
还有一点要老实说:现在的启动器在下载时不会自己核对 SHA256SUMS.txt。只有你按下面的步骤做了,才算核对过。
核对方法
1. 核对指纹(有没有损坏、有没有被掉包)
- 从 GitHub Releases 的同一个发布里,把 zip 和
SHA256SUMS.txt下载到同一个文件夹。 - 在那个文件夹里打开 PowerShell:按住 Shift 在文件夹的空白处右键 →“在此处打开 PowerShell 窗口”(Windows 11 是“在终端中打开”)。
- 输入下面这行并按回车。
Get-FileHash .\PocketRoles-0.5.5.zip - 显示的
Hash(64 个字符)和SHA256SUMS.txt里同名的那一行相同就 OK。大小写不同没有关系。
想一次核对全部的话,用这 1 行(每个文件会显示 OK 或 NG)。
Get-Content .\SHA256SUMS.txt | ForEach-Object { if ($_ -match '^([0-9a-f]{64}) (.+)$') { $ok = (Get-FileHash -LiteralPath ".\$($Matches[2])").Hash -ieq $Matches[1]; ('{0} {1}' -f $(if ($ok) { 'OK' } else { 'NG' }), $Matches[2]) } }
这样能确认:
- 下载过程中没有损坏。
- 就是清单里写的那个文件。
- 清单本身有没有被掉包,这样查不出来。那要靠下面的“核对签名”。
2. 核对签名(清单是不是作者发布的)
核对工具就在 PocketRoles 的源代码里(tools/sign-definitions.ps1)。不需要私钥,也不需要密码。
- 在 GitHub 页面点“Code”→“Download ZIP”下载源代码,然后解压。
- 把发布的 4 个文件(2 个 zip、
SHA256SUMS.txt、SHA256SUMS.txt.sig)放进同一个文件夹。 - 在 PowerShell 里输入下面这行(2 处
<…>改成你自己的文件夹)。powershell -NoProfile -ExecutionPolicy Bypass -File "<源代码的文件夹>\tools\sign-definitions.ps1" -VerifyRelease "<放了 4 个文件的文件夹>\SHA256SUMS.txt" - 出现“署名 OK(鍵 91400fdf0f5af4ca)”和绿色的“検証 OK”,就说明清单是用作者的密钥签名的。同时它也会把 zip 的指纹和清单对比。(工具的提示是日文。)
- 出现红色文字时,请不要使用那个文件。如果能通过“联系”告诉我们,就更好了。
3. Aegis 的定义文件
自动进行。模组和托盘程序每次收到文件都会核对签名。想自己看的话,请看托盘程序扫描画面的“签名 OK”,或模组的 /ac rules。
谁来决定签名
- PocketRoles 由作者 1 个人开发(GitHub:@wakayamachannel)。
- 每次签名都由作者在自己的电脑上输入密码完成。不会自动签名。
- 其他人提交的修改(Pull Request),作者会全部读完并确认后再合并。
- 作者的 GitHub 账户使用双重身份验证(2FA)。
今后
- 计划给 exe 启动器加上 Windows 的代码签名,正在准备申请。还没有获得批准。获得批准后会在本页补充。
- 即使有了签名,刚开始的一段时间也可能仍然出现蓝色画面。Windows 需要一些时间才会信任新的发布者。
- 模组本体(
PocketRoles.dll)不在这个计划里,因为构建它需要 Among Us 的文件。
详细说明与联系方式
- 详细说明(GitHub):docs/CODE-SIGNING.zh-CN.md
- 提问:联系
- 安全问题:SECURITY.md(GitHub)