本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
对于electron应用来说,如果你不做代码签名,在别人安装你的应用的时候就会出现以下情况
windows系统会认为你的应用是个有风险的应用,阻止你去安装。这对用户来说,下载下来的应用,系统都通知有风险了,多少会有点不放心,更多的还是觉得你的应用可能有问题。
即使点击了更多信息,之后仍要运行,就会出现下面的弹窗
windows还是会进一步提示,Windows操作系统中弹出的「不明发行商」的弹窗。
这种情况对于要对外推广的应用来说,是非常严重的问题。因此我们要让windows系统信任我们的应用。这里就要使用到代码签名,消除Internet Explorer以及Windows操作系统中弹出的「不明发行商」;减少代码程序及内容出现错误讯息和安全性警告,建立品牌的信任关系。防止使用者下载到含有恶意档案的代码程序及内容。
首先,windows的证书是需要去有资质的商家进行购买的(是要花钱滴!)
,这里建议买EV代码签名证书
,如果是在公司的话,你可以就需要去找公司采购帮忙了。现在买的证书都是以签名狗(类似与银行的U盾)的方式进行发放,确保了安全性,但是需要每年都更换一次。
在购买完成后,客服会给你发送代码签名使用工具软件,以下两个
之后分别安装,得到以下两个软件
但是有个最大的问题就是,这个签名工具无法进行导出pfx证书,只能导出cer格式的不带私钥的证书。它可以对已经打包完的exe进行签名,很明显这对electron来说是不合适的。对打包完的exe进行签名,会导致无法升级的问题,所以需要在打包的时候就将证书打进去。
而我们使用的打包工具是electron-builder,它仅支持pfx格式的证书,以下为官网内容
certificateFile
String | “undefined” - The path to the *.pfx certificate you want to sign with. Please use it only if you cannot use env variableCSC_LINK
(WIN_CSC_LINK
) for some reason. Please see Code Signing.
因此我们只能这么处理。
- 插入签名狗(U盾)
- 打开这个软件VSigntool
- 点击刷新,此刻会出现证书项,显示自己公司的公司名称等信息
- 双击证书项
- 点击头部详细信息
- 点击复制到文件
- 点击下一步连续三次
- 点击浏览,选择要导出文件的名称以及路径,之后点击下一步
- 点击完成提示导出成功,点击确认即可。之后找到导出的不带私钥的证书
- 选中此文件进行重命名,将后缀cer改为pfx
- 将文件放到项目的根目录
- 打开safeNet Authentication Cllient软件(确保此时U盾处于插入状态)
- 选择第二项修改token证书密码,得到新密码
- 按照如下图顺序点击选中,将签名密码设置为单点登录,即打包时不需要输入过多次数的密码。
- 在electron-builder打包配置中加入证书配置项,如下图
1verifyUpdateCodeSignature: false,
2signingHashAlgorithms: [
3'sha256'
4],
5signDlls: true,
6rfc3161TimeStampServer: 'http://timestamp.comodoca.com',
7certificateFile: 'test.pfx',
8certificatePassword: '******',
9certificateSubjectName: ''
- 运行打包命令开始打包,打包过程中会出现密码输入提示,输入密码即可(存在多次输入,保持输入一直到打包完成!如完成14的单点登录,则输入开始弹出的所有密码框即可)
- 打包完成后,找到打包好的安装包,右键 =>属性,查看,标题栏是否有数字签名栏,点击查看签名,如下图,证明安装包已完成代码签名
- 双击安装包,如下图出现已验证的发布者,表示你已经成功啦!
以上 我们就完成了electron应用的windows代码签名,再也不用担心安装应用时被windows系统拦截啦。
另外分享一个小技巧,由于我们测试环境分为好几套,test1, test2等,巴拉巴拉巴拉的一堆环境,这就产生了我们多个环境包并存的问题, 经过调研发现,只要package.json中的name不重名,就相当于是不同的包,就不会覆盖掉其他环境的包。因此我们只要在打包时候修改下对应名称就可以了。
但是每次打包都要修改又太麻烦,于是想到了使用node去修改package.json中的name,首先在根目录下创建setName.js文件,内容如下
1const fs = require('fs')
2const path = require('path')
3const settingFilePath = path.join(__dirname, '/package.json')
4let settingFile = fs.readFileSync(settingFilePath)
5settingFile = JSON.parse(settingFile)
6settingFile.name = '你来定义'
7fs.writeFileSync(settingFilePath, JSON.stringify(settingFile, null, 2))
之后在打包命令中添加如下
这样就不要我们每次打包去修改名称了。
electron应用代码签名windows篇,完结撒花!
electron的windowsEV签名方法好难找,实践发现electron-builder.yml里只配置一句certificateSubjectName: ‘令牌名称’也可以签名成功