Electron 在 Windows 下的代码签名

原文转载自 「oldj's blog」 ( https://oldj.net/article/2022/07/15/code-signing-with-electron-on-windows/ ) By 老杰

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)

代码签名是开发者对软件进行的数字签名,用户可根据签名确认开发者的身份,确保自己下载的版本来源可信且没有经过第三方篡改。

Electron 开发的应用也可以进行代码签名,其中 macOS 相对简单,可参见我之前写的《macOS 下 Electron 程序的签名及公证》,Windows 下有些麻烦,我也走了一些弯路才成功,在此记录一下。

购买证书

Windows 下给应用程序做签名,需要一个签名证书,这个证书需要花钱购买。对比了多家证书服务商之后,我发现 CheapSSLSecurity 应该是最便宜的,似乎也没什么重大负面评论,最后便在这儿下了单。他们的速度很快,材料准备齐全的话,从下单到拿到证书最快只需要一天。

代码签名证书有普通版和 EV 版两种,其中普通版支持个人开发者或者公司购买(分别称为 IV 版和 OV 版),EV 版则只支持公司或组织购买,能提供更高的安全性,但也更贵。关于两者的更多区别可查看网上相关说明,此处不再赘述。

下面记录的是普通版代码签名证书的购买和使用。

下单

在 CheapSSLSecurity 顶部导航中找到“Code Signing Certificates”,点进去可以看到它销售的代码签名产品列表,其中最流行的是“Comodo Code Signing”,我购买的就是这个,将它加入购物车,结算即可。只购买一年需要 83 美元,一次性购买三年则每年只需 69.17 美元。

如果你没有账号,下单之后,CheapSSLSecurity 会提醒你创建账号。

申请证书

下单成功之后,CheapSSLSecurity 会向你显示一个申请证书的界面,需要你在这个页面填写申请主体的名字、地址等信息,最后还要填写一个 CSR(Certificate Signing Request,证书签名请求文件)。

这一步有一个需要注意的地方,即最好使用 IE 浏览器进行申请。我之前申请时就在这儿踩了坑,因为我日常常用 macOS,申请时见到那个 CSR 是可以手工填写的,就在 macOS 上用 Chrome 浏览器进行了申请,并用其他工具生成了 CSR 填写提交,结果后面生成证书时流程被卡住,只好从头重新提交申请,还好不需要再次付费。

由于现在 Windows 11 上已经没有 IE 了,所以还需要一台 Windows 10 或者 Windows 7/8 电脑,虚拟机也可以。虽然申请证书的流程需要在 IE 上操作,但最后证书可以导出在其他机器上甚至 macOS 上使用。

CheapSSLSecurity 的官网上也有使用 Firefox 申请的说明,但我尝试了一下,没有成功,最简单的方式可能还是在 Windows 上操作。

使用 IE 申请证书时,CSR 那一栏可以选择让浏览器自动生成,各项设置使用默认值即可。

资料验证

CheapSSLSecurity 其实只是证书的代理商,在 CheapSSLSecurity 提交申请之后,你会收到来自 Sectigo 的邮件,点击邮件中的链接可以看到进展,主要是证书颁发机构要验证一下订单的有效性、申请者信息的有效性等。

顺利的话,过一段时间你会收到进行下一步的邮件提醒,内容为需要你上传证书管理员的身份证照片以及个人手持身份证的照片,照片上可以自行添加水印。

照片验证通过之后,会收到再下一步的邮件,验证申请者(或者公司)联系电话的有效性,按提示操作即可。这一步中,他们的网站上会显示对应的电话,你可以选择立刻呼叫或者指定一个时间呼叫,还可以选择电话的语言,支持中文普通话。点击立刻呼叫,对应的电话就会接到一个美国号码的来电,其中会播放一个 6 位的数字验证码,将这个验证码填入网页就完成了。

获取证书

电话验证通过之后,很快会收到提示“Your Code Signing Certificate is ready”的邮件,此时,就可以点击邮件中的链接,获取证书了。

需要注意的是,这一步需要在之前生成 CSR 的那个 IE 浏览器上继续操作。

根据页面提示,一路确定,最后看到如下图所示的界面,就表示证书获取成功了。

获取证书

此时,代码签名证书便已生成并安装到当前 IE 浏览器中了。

导出证书

接下来,点击 IE 浏览器的设置,在【Internet 选项】面板点击【内容】→【证书】,应该就可以在【个人】栏看到新的项目,这即是刚刚生成并安装的代码签名证书。

导出证书

选中这个证书,点击【导出】,即可将它导出为一个 pfx 格式的证书。注意需要同时导出私钥。

使用证书进行签名

有了这个证书之后,就可以在 Electron 打包时对生成的 exe 或安装文件进行签名了。

我使用的是 electron-builder 进行打包,在官方文档 Windows 打包 部分,有关于证书签名参数的详细说明。

配置

我的相关配置如下:

win: {
	icon: 'assets/logo.ico',
	legalTrademarks: 'WonderPen',
	verifyUpdateCodeSignature: false,
	// 以下是代码签名相关部分
	signingHashAlgorithms: ['sha256'],
	signDlls: false,
	certificateFile: path.join(root_dir, 'scripts', 'tm.pfx'),
	certificatePassword: CERT_PSWD,
	rfc3161TimeStampServer: 'http://timestamp.digicert.com',
	timeStampServer: 'http://timestamp.digicert.com',
},

随后便是正常的打包过程。

验证

打包完成之后,在 Windows 下查看生成的 exe 文件的属性,如果一切顺利,可以看到属性中多了一个“数字签名”标签,点击可以显示签名的详细信息,如下图所示:

签名信息

到这一步,就表示代码签名已经成功完成了。

其他

需要注意的是,因为上面使用的是普通代码签名,因此即使对应用程序进行了代码签名,用户使用 Edge 等浏览器下载以及运行时,仍然可能会显示警告,只是此时警告中会显示开发者的名字,比如你申请时填写的公司名,而不再是未知开发者。据网上的资料,当有足够多的用户下载、安装之后,这个警告会消失,不过没有找到这个“足够多”具体是什么判定标准。

如果想一开始就不要有这个警告,需要购买 EV 数字签名证书。这个证书更贵,操作也更复杂一些,我也没实践过,将来如果有了经验再进行分享。

另外,以公司名义申请代码签名证书时,公司名可以填中文也可以填英文,建议填英文以获得更好的兼容性,因为中文名称在一些地方可能会显示为乱码,比如下图这样:

公司名乱码

小结

在软件分发的时候,代码签名能确保用户下载到的副本是你打包签名的版本,没有被人篡改,可提升用户对产品的信任。

代码签名证书需要花钱购买,一年少则数百,多则数千。其中 CheapSSLSecurity 等服务商提供了价格友好的证书,如果预算有限可以考虑这些服务商。

申请证书的过程,可能要用到 IE,需要提前准备好对应的机器。证书颁发之后可以导出在其他设备或者系统上使用。

获得证书之后,使用 electron-builder 等工具,只需几行配置即可方便地给生成的文件进行签名。