Electron 使用 OV 代码签名证书

去年写过一篇 Electron 在 Windows 下的代码签名,今年 7 月中旬,这个证书要到期了,准备续一下,结果发现现在已经不再新签发纯数字代码签名证书了,要进行代码签名,必须购买带 U 盾硬件的版本。和原来的数字版相比,U 盾版贵了不少,而且由于 U 盾需要邮寄,还需要额外的邮费,花费的时间也比数字版多了很多。

U 盾证书的使用和纯数字证书有一些不同,下面记录一下主要过程。

购买证书

购买过程就不详述了,有很多服务商,比如 DigiCert、Sectigo、SSL.com、CheapSSLSecurity 等,当然,也可以在淘宝上找代理。

我是通过淘宝代理购买的 Sectigo 的证书,因为比较了下这样最划算。证书是由 Sectigo 官方从加拿大寄过来的,我下单时由于厂商芯片缺货,等待了 21 天才发货,不过发货之后就快了,从发货到 U 盾到手只过了 4 天。

下图是我收到的 U 盾的样子。

准备工作

由于我的主力开发机器是 M1 芯片的 MacBook Pro,我希望能直接在 mac 上使用这个 U 盾,而不要在打包签名时换电脑。一番探索之后,发现是可以实现的,主要要点如下:

  • macOS 上安装 Parallels Desktop 专业版
  • 在 Parallels 中安装 Arm 版 Windows 11
  • U 盾需要与 Parallels 中的 Windows 11 连接,而不是与 macOS 连接

接下来,需要在虚拟机中的 Windows 11 上安装 SafeNet Authentication Client (SAC) 软件,一般可从证书颁发商网站或者发你的邮件中找到下载链接。

安装之后,插上 U 盾,如果在 SAC 软件中看见了你的设备,就表示一切正常,如下图所示。

证书颁发商发来的邮件中包含了初始密码,可在这个软件中修改密码。注意保管好新密码,万一不慎遗失会比较麻烦。

安装证书

接下来,需要将这个证书安装到当前 Windows 系统中。

点击 SAC 界面中的高级视图:

找到证书,双击安装即可,如下图所示:

另,SAC 软件也有 macOS 版,但这个证书似乎无法安装在 macOS 上。即使安装了应该也没有用,因为后面签名时仍然会调用 Windows 中的证书。

在 Electron 中使用

我使用的是 electron-builder 进行的打包、签名,主要库以及版本号如下:

  • electron@25.3.1
  • electron-builder@24.4.0

其中 electron-builder 的关键配置如下:

win: {
  // ...
  verifyUpdateCodeSignature: true,
  signingHashAlgorithms: ['sha256'],
  signAndEditExecutable: true,
  signDlls: false,
  certificateSubjectName: 'YOUR_NAME',
  publisherName: 'YOUR_NAME',
  rfc3161TimeStampServer: 'http://timestamp.sectigo.com',
  timeStampServer: 'http://timestamp.sectigo.com',
},

将其中的 YOUR_NAME 换成你证书中的名字即可。

问题处理

签名过程中,我遇到了下面的错误:

ensure that 'Share folders' is set to 'All Disks', see https://goo.gl/E6XphP
Error: Exit code: 2. Command failed: prlctl exec {e28c7c00-0805-4729-91e9-3bfeacdbbbf8} --current-user \\Mac\Host\\Users\wu\Library\Caches\electron-builder\winCodeSign\winCodeSign-2.6.0\windows-10\arm64\signtool.exe sign /tr http://timestamp.digicert.com /sha1 C2F9D1106A2D69E*****************3E9C475B /s My /fd sha256 /td sha256 /d ......

研究了一会儿,发现是因为我的 mac 是 M1 芯片,装的 Windows 11 虚拟机也是 Arm 版的,而目前 winCodeSign 工具还没有提供 Arm 版的签名工具,于是命令失败。

解决办法很简单,导航到 mac 的 ~/Library/Caches/electron-builder/winCodeSign/winCodeSign-2.6.0/windows-10/ 目录下,把 x64 目录复制一份,并重命名为 arm64 即可。

接下来,应该就能给 Electron 的 exe 文件顺利地签名了。

改进

签名虽然能顺利完成,但过程中却会多次出现密码输入框,如下图所示:

这个密码输入过程不但烦琐,还让命令无法自动完成,因为每次流程都会被卡住,需要手工输入密码。

按理这个地方应该有更优雅的做法,electron-builder 的文档中也提到了 certificatePasswordCSC_KEY_PASSWORD 等参数,但我试了多次却总是不能生效。

最后,我写了一个简单的 AHK 脚本解决了问题。脚本内容如下:

Loop
{
    If WinExist("设备登录", "令牌密码")
    {
       WinActivate
       Sleep 500
       Send "{Raw}YOUR_PASSWORD"
       Send "{Enter}"
    }
    Sleep 1000
}

注意将其中的 YOUR_PASSWORD 替换为你的密码。当然,你也可以将密码保存在环境变量中,然后在 AHK 脚本中从环境变量读取。

小结

U 盾代码签名证书的购买、使用都比之前的数字证书要麻烦,不过为了提升用户下载、安装软件的体验以及安全性,这个证书还是值得的。

这个签名证书需要安装在 Windows 中,不过 macOS 上的 Parallels 虚拟机也可以。

一些相关事项也可以看我一年前写的数字证书的用法

分类:编程标签:Electron

相关文章:

评论:

暂无评论

发表评论: