Windows 上把安装包直接发给别人时,系统经常会把它当成未知发布者,SmartScreen 会拦住。这篇只谈代码签名本身:哪些办法其实签了也没用,免费的 SignPath Foundation 适合什么项目,以及它和 GitHub Actions 怎么配合。不涉及任何一个具体应用的地址、账号或配置。
省流版:
- 自己生成的证书只在你这台电脑上可信,别人下载照样报警。
- 苹果开发者会员只能签 Mac,不能签 Windows 安装包。
- 公开、使用 OSI 开源协议、并由托管 CI 构建的项目,可以申请 SignPath Foundation。用户看到的发布者名字是 SignPath Foundation,不是作者本人。
- 审核没有固定天数。公开经验里常见的是一两周,也有人等到一个月以上。结果发到申请邮箱。
- 私钥不会发给你。签名在对方的服务里完成。
一、Mac 和 Windows 是两套签名
Mac 上给公开下载的应用签名,用的是 Developer ID Application,签完还要做公证。企业账号是给组织内部发应用的,拿去公开下载,证书有被吊销的风险。这套会员资格不能用来签 Windows 的 .exe。
Windows 要减少 SmartScreen 的拦截,需要系统信任的 Authenticode 证书。本机用工具做出来的自签名证书,换一台电脑就不被信任。
付费证书里,普通的 OV 往往也要积累一段时间的信誉,报警才会变少。EV 可以更快去掉提示,但通常要求公司主体,费用也更高。微软的 Artifact Signing,个人申请目前主要面向美国和加拿大,组织核验也不覆盖所有地区,提交前要先看自己是否符合地区要求。
二、SignPath 实际在签什么
SignPath Foundation 面向符合条件的开源项目,免费签发 Windows 安装包。常见条件是:仓库公开、协议属于 OSI 认可的开源协议、安装包由 GitHub 托管的构建机器从公开仓库打出来,而不是在个人电脑上手工打包再上传。
它不会把证书文件交给你。构建完成后,CI 把未签名的安装包交出去,签名完成后再拿回来。用户属性里的发布者是 SignPath Foundation。
申请时他们还会看这些公开材料,而不是看你的私钥:
- 仓库必须是公开的。私有仓库不能走这套免费签名。
- 要有一个用户能打开的下载页,并且页面上写明该项目使用 SignPath Foundation 做代码签名。
- 如果软件会把数据发到开发者自己的服务器,需要有公开的隐私政策,并让用户知道这件事。具体收集哪些字段,不要写进签名教程。
- 通过之后,GitHub 和 SignPath 账号都要打开两步验证。
三、申请表只记字段,不记答案
表单在 signpath.org/apply.html。它会要项目名、仓库地址、主页、下载页、隐私政策、一句话介绍、项目说明和维护者类型。这些内容填进表单即可。
不要把填好的表、组织编号、项目标识、令牌写进博客、仓库说明或聊天记录。令牌等同于签名权限。仓库地址和下载页本身是公开的,但没有必要在一篇教程里再抄一遍。
介绍和说明用英文写清软件做什么、安装包从哪来。没有媒体报道就照实写,不要编下载量。邮箱用一个真能收信的地址,不要用 GitHub 的 noreply 邮箱。
维护者是个人就选 Individual,构建系统是 GitHub Actions 就选 GitHub Actions。公司名称可以留空。没有维基百科页面也留空。
四、审核要多久,怎么通知
SignPath 没有公布固定工作日。别人公开记下来的等待多半是 1 到 2 周,也有 4 周甚至更久。新仓库、材料不齐,都会更慢。对方先回邮件让你补下载页或隐私政策,这是补材料,不是拒绝。
通过、补材料、拒绝,都发到申请表里的那个邮箱。账号也用这个邮箱开通。提交后看收件箱,也看垃圾邮件。网站上没有另外的进度查询页。
五、通过之后怎么接到构建流程
等邮件里的开通说明到了再接。下面只保留机制,不写任何一项真实配置的值。
- 登录 SignPath,打开两步验证。
- 安装他们的 GitHub App,只授权需要签名的那个仓库。可信构建系统选择 GitHub.com,这样签名请求必须来自托管的 GitHub Actions,而不是任意一台机器。
- 在 SignPath 里建立项目和签名策略。策略用来规定谁可以批准一次签名。
- 如果 CI 上传文件时会先打成 zip,产物配置就要按「压缩包里的可执行文件」来描述,而不是按一个裸的 exe。文件名只放在 SignPath 的配置里,不要写进文章。
- API 令牌放进仓库的 Actions secret。组织编号和项目标识放进 Actions 变量。这些值只留在 GitHub 的设置页。
比较稳妥的接法是:令牌还没填时,发布流程照常交出未签名的安装包,避免审核没通过就让整个发布失败。令牌填上之后,构建完成、发布之前,把未签名文件提交给 SignPath 的官方 Action,等签名结束,再用签好的文件替换原文件,然后才挂到 Release。
Action 的名字以 SignPath 文档里的当前版本为准。不要把工作流文件、安装包文件名和密钥名称整段贴出来。
六、签完之前仍然是未签名
申请提交之后、第一次签名成功之前,用户下载到的仍然是未签名安装包,SmartScreen 仍可能出现。邮件通过并且新的构建跑完,发布者才会变成 SignPath Foundation。
Mac 不走这套。Mac 仍然用开发者自己的 Developer ID 和公证。两套签名可以同时存在,不能互相代替。
