6

Electron 使用 OV 代码签名证书

 1 year ago
source link: https://oldj.net/article/2023/08/01/code-signing-with-electron-on-windows-2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Electron 使用 OV 代码签名证书

2023-08-01

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

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

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

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

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

5IwNS9Pqvy.jpg

由于我的主力开发机器是 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 软件中看见了你的设备,就表示一切正常,如下图所示。

code_sign_01.png

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

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

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

code_sign_02.png

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

code_sign_03.png

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

在 Electron 中使用

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

其中 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 C2F9D1106A2D69E9351CCE1EF1B6E1AA3E9C475B /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 文件顺利地签名了。

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

code_sign_04.png

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

按理这个地方应该有更优雅的做法,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 虚拟机也可以。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK