代码签名策略

本页说明 ResumeForge 的代码签名政策:签名覆盖哪些文件、签名请求由哪一次构建产生、谁负责批准,以及签名对用户隐私的影响。文中每一条都对应公开仓库中的实现或可核对记录;签名范围之外的文件同样列在下文。

  • 适用版本 v2.0.0
  • 更新于 2026-11-06

政策与署名

ResumeForge 的 Windows 安装包由 SignPath Foundation 的免费开源代码签名计划提供签名。证书主体为 SignPath Foundation,而非项目维护者的 GitHub 账号;这是该计划的既定安排。当前是否已有签名版本发布,以「当前状态」一节为准。

Free code signing provided by SignPath.io, certificate by SignPath Foundation.

本页是 SignPath 要求项目公示的签名政策。下文所述流程与仓库中的工作流定义一一对应,可直接对照公开代码核对。

签名覆盖哪些文件

签名范围仅包含一个产物:Windows 安装包 ResumeForge-Setup-<version>.exe(NSIS 安装器)。该文件使用 SHA-256 摘要的 Authenticode 签名;RFC 3161 时间戳由 SignPath 侧的签名策略附加。仓库中的工作流不向签名服务传递任何签名参数,摘要算法与时间戳均由 SignPath 的 artifact configuration / signing policy 决定,相关配置需在 SignPath 后台核对。时间戳的作用是:即使证书日后到期或被吊销,已发布安装包的签名仍可验证为「签名当时有效」。

其余产物不在签名范围内,具体如下:

产物签名范围说明
ResumeForge-Setup-<version>.exe包含Windows 安装包;SHA-256 Authenticode,RFC 3161 时间戳由 SignPath 侧签名策略附加
ResumeForge-<version>-x64.dmg / -arm64.dmg不包含macOS 签名证书尚未配置,因此未签名、也未公证;首次打开需右键 →「打开」,或按安装文档的说明处理。证书配置后将更新本表
源码 zip(all / windows / macos)不包含纯源码发行包,用对应的 .sha256 校验完整性;它不会被当作程序直接执行,因此无需 Authenticode 签名

每个安装包与 dmg 均附带同名 .sha256 文件,与 Release 页面上的附件一一对应;哈希值按最终发布的文件计算。

签名来自哪一次构建

签名请求仅有一个来源:公开仓库 magicapple123/ResumeForge 里的 .github/workflows/release-assets.yml。流程固定为三步:

  • GitHub 托管的 windows-latest runner 从指定的 tag(或用于演练的 ref)检出源码,构建前端与桌面壳,打出 NSIS 安装包;
  • 该安装包作为本次 workflow run 的 artifact 上传;
  • SignPath 的 GitHub Action 用该 artifact 提交签名请求,并校验它确实来自这一次 workflow run(origin verification)之后才会签名;签名完成后把重签的文件回传给同一次 run。

构建与签名均在 CI 中完成,不存在经由开发机或人工上传安装包签名的通道。要确认某次发布是否经由该流程,可查看该 release 对应的 workflow run:运行页面会记录签名请求的链接与请求 ID。

团队角色与批准流程

项目目前由单一维护者维护(Cenguo Huang,GitHub @magicapple123)。下列三个角色当前均由该维护者承担;三者按职责划分,不因人员数量而合并。

角色成员职责
Authors@magicapple123编写并提交代码。外部贡献者的 Pull Request 须经维护者评审后方可合入 main;外部贡献者没有直接推送权限。
Reviewers@magicapple123评审与发布链路相关的改动,包括构建脚本、release-assets.yml 中与签名相关的每个步骤,以及版本号与 tag。改动须经评审通过后合入。
Approvers@magicapple123批准签名请求。每次签名请求均需 Approver 在 SignPath 后台人工批准;CI 通过不会自动签发。

维护者在 GitHub 与 SignPath 两个账号上均启用了多因素认证(MFA)。签名所需的 API token 只存放在 GitHub 仓库的 Secrets 里,工作流运行时注入,不出现在日志或产物中。

隐私

签名完全发生在构建侧,不涉及终端用户数据。引入签名不改变隐私与数据主权页面中的任何承诺:简历、岗位、资料、提醒与助手会话只保存在本机数据目录,应用没有账号体系、埋点或遥测,AI 功能仅在用户主动调用时联网。

签名环节涉及的两个系统只获得必要信息:SignPath 接收待签名的二进制文件,以及该次构建的 workflow 元数据(仓库、commit、run 标识),用于验证来源。签名服务不接触用户数据,用户数据既不在构建产物中,也不在上传范围内。签名也不会在用户电脑上安装或修改任何内容;安装包保存在本地,签名验证由 Windows 完成。

如何验证签名

签名生效后,Windows 安装界面显示的发布者名称为 SignPath Foundation,而非 magicapple123。证书由基金会持有并签发给通过审核的开源项目,因此发布者名称与项目作者不一致属于正常情况。该签名证明的是:文件由本项目的 CI 构建,并由基金会签发。

如需自行验证,可在 PowerShell 中执行以下命令(将文件名替换为实际下载的文件):

命令检查项
Get-AuthenticodeSignature .\ResumeForge-Setup-<version>.exe | Format-List Status, StatusMessage, SignerCertificateStatus 应为 Valid;若不是,StatusMessage 会说明原因(常见为根证书不受信任)。SignerCertificate.Subject 应包含 SignPath Foundation
Get-FileHash .\ResumeForge-Setup-<version>.exe -Algorithm SHA256与 Release 页面上同名 .sha256 附件的内容比对,确认下载没有出错
Get-AuthenticodeSignature .\ResumeForge-Setup-<version>.exe | Select-Object -ExpandProperty TimeStamperCertificate能取到时间戳证书,说明 RFC 3161 时间戳已经附加

若 Status 为 NotSigned,说明该文件没有签名,常见原因是该版本发布于签名接入之前。此时仍可用 SHA-256 校验文件完整性,但不应将其视为已验证发布者的文件。

当前状态

截至 2026-11-06,test-signing 已通过端到端验证:CI 完成了构建、上传 artifact、提交签名请求、SignPath 验证来源、回签,以及用签名后的文件生成 .sha256 的完整流程,签名请求状态为 Completed。该结果即上文所述流程的一次实际执行记录。

可核对的记录有两份:演练工作流运行(全部作业通过),以及对应的签名请求 ec1837db-7b38-4053-8f70-ea8b34824e8e(可在 SignPath 后台的 Signing Requests 中查询)。本次签名使用 test-signing 的测试证书,主体为 CN=Test certificate for 'ResumeForge [OSS]';其根证书不在 Windows 信任列表中,因此签名验证状态为 UnknownError,而非 Valid。这是该阶段的预期结果:测试证书用于验证流程可用,其产物不面向最终用户,也不会发布到 Release。

生产证书仍待 SignPath Foundation 签发,因此 Release 中当前可下载的安装包尚未签名。在此之前,请使用 .sha256 校验下载文件,并按 Windows 的常规提示完成安装。状态发生变化时,本页与 CHANGELOG.md 将同步更新。

如对本页有疑问,可在公开仓库中查阅签名工作流、构建脚本与发布记录,也可以到 GitHub Issues 提问。