首页/文章/electron

【Electron】vue+electron代码签名(windows篇)

2024-07-23
19687 分钟
...

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

对于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 variable CSC_LINK (WIN_CSC_LINK) for some reason. Please see Code Signing.

因此我们只能这么处理。

  1. 插入签名狗(U盾)
  2. 打开这个软件VSigntool

  1. 点击刷新,此刻会出现证书项,显示自己公司的公司名称等信息

  1. 双击证书项

  1. 点击头部详细信息

  1. 点击复制到文件

  1. 点击下一步连续三次

  1. 点击浏览,选择要导出文件的名称以及路径,之后点击下一步

  1. 点击完成提示导出成功,点击确认即可。之后找到导出的不带私钥的证书

  1. 选中此文件进行重命名,将后缀cer改为pfx

  1. 将文件放到项目的根目录

  1. 打开safeNet Authentication Cllient软件(确保此时U盾处于插入状态)

  1. 选择第二项修改token证书密码,得到新密码

  1. 按照如下图顺序点击选中,将签名密码设置为单点登录,即打包时不需要输入过多次数的密码。

  1. 在electron-builder打包配置中加入证书配置项,如下图

verifyUpdateCodeSignature: false,
signingHashAlgorithms: [
'sha256'
],
signDlls: true,
rfc3161TimeStampServer: 'http://timestamp.comodoca.com',
certificateFile: 'test.pfx',
certificatePassword: '******', 
certificateSubjectName: ''
  1. 运行打包命令开始打包,打包过程中会出现密码输入提示,输入密码即可(存在多次输入,保持输入一直到打包完成!如完成14的单点登录,则输入开始弹出的所有密码框即可)

  1. 打包完成后,找到打包好的安装包,右键 =>属性,查看,标题栏是否有数字签名栏,点击查看签名,如下图,证明安装包已完成代码签名

  1. 双击安装包,如下图出现已验证的发布者,表示你已经成功啦!

以上 我们就完成了electron应用的windows代码签名,再也不用担心安装应用时被windows系统拦截啦。

另外分享一个小技巧,由于我们测试环境分为好几套,test1, test2等,巴拉巴拉巴拉的一堆环境,这就产生了我们多个环境包并存的问题, 经过调研发现,只要package.json中的name不重名,就相当于是不同的包,就不会覆盖掉其他环境的包。因此我们只要在打包时候修改下对应名称就可以了。

但是每次打包都要修改又太麻烦,于是想到了使用node去修改package.json中的name,首先在根目录下创建setName.js文件,内容如下

const fs = require('fs')
const path = require('path')
const settingFilePath = path.join(__dirname, '/package.json')
let settingFile = fs.readFileSync(settingFilePath)
settingFile = JSON.parse(settingFile)
settingFile.name = '你来定义'
fs.writeFileSync(settingFilePath, JSON.stringify(settingFile, null, 2))

之后在打包命令中添加如下

这样就不要我们每次打包去修改名称了。

electron应用代码签名windows篇,完结撒花!

 

electron的windowsEV签名方法好难找,实践发现electron-builder.yml里只配置一句certificateSubjectName: '令牌名称'也可以签名成功

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
electron2025-03-05
不依赖第三方库自己实现 Electron 的主与渲染进程的国际化功能
正文 直接贴出代码: 主进程实现 首先需要在 文件中获取当前系统的语言,然后初始化国际化相关: 文件: 文件 然后在主进程中就可以通过 来实现国际化了。 渲染进程的实现 App 在启动的时候渲染进程已经执行了国际化的初始化,所以在主进程已经保存了一份当前语言的 信息,所以渲染进程就不需要进程这一步,直接从主进程获取即可。 主进程进程添加一个 事件,供渲染进程获取国际化相关数据: 首先我们要在 preload 中提前将国际化相关的信息写入...
学习
electron2025-03-05
应用多开,限制只启动一个应用,防止多个实例
通过app.requestSingleInstanceLock来控制应用的多开,返回值为boolean。 此方法的返回值表示你的应用程序实例是否成功取得了锁。如果它取得锁失败,你可以假设另一个应用实例已经取得了锁并且仍旧在运行,并立即退出。 即:如果当前进程是应用程序的主要实例,则此方法返回true,同时你的应用会继续运行。如果当它返回false,如果你的程序没有取得锁,它应该立刻退出,并且将参数发送给那个已经取到锁的进程。 在macO...
学习
electron2024-09-23
Electron实现文件缓存背景
背景 基于Electron研发的一款IM企业通信桌面端应用,会存在非常多文件、图片、视频类型回话消息。在Electron应用(桌面客户端软件)中,快速加载并显示图片是提升用户体验的关键。然而,传统的图片加载方式往往存在加载速度慢、资源占用高等问题,影响了用户的使用体验。 解决的问题 1. 支持自定义配置存储的磁盘位置 2. 支持长期存储 3. 支持自定义存储大小 4. 支持自定义存储类型(如图片、视频、文件,或者更细致化到MIME) 5...
学习
electron2024-09-23
我的 Electron 客户端也可以全量和增量更新了
前言 本文主要介绍 客户端应用的自动更新,包括全量和增量这两种方式。 全量更新: 运行新的安装包,安装目录所有资源覆盖式更新。 增量更新: 只更新修改的部分,通常是渲染进程和主进程文件。 本文并没有拿真实项目来举例子,而是起一个 新的项目 从 0 到 1 来实现自动更新。 如果已有的项目需要支持该功能,借鉴本文的主要步骤即可。 前置说明: 1. 由于业务场景的限制,本文介绍的更新仅支持 操作系统,其余操作系统未作兼容处理。 2. 更新流...
学习
electron2024-09-20
我的 Electron 客户端被第三方页面入侵了
问题描述 公司有个内部项目是用 来开发的,有个功能需要像浏览器一样加载第三方站点。 本来一切安好,但是某天打开某个站点的链接,导致 整个客户端直接变成了该站点的页面 。 这一看就是该站点做了特殊的处理,经排查网页源码后,果然发现了有这么一句代码。 翻译一下就是:如果当前窗口不是顶级窗口的话,将当前窗口设置为顶级窗口。 奇怪的是两者不是 跨域 了吗,为什么 还可以影响顶级窗口。 先说一下我当时的一些解决办法: 1. 用 替换 2. 给 添...
学习
electron2024-09-13
Electron+WebRTC实现局域网内的远程控制软件
我的工位上有一台笔记本(windows),一个显示器,一台服务器(linux)。显示器同时连接笔记本和服务器,当需要用到服务器的时候:1.使用todesk等软件进行连接;2.直接把显示器切换到服务器桌面,然后给服务器插上鼠标键盘。在这种场景下,屏幕画面的传输对我来说并不是必要的,这种场景下能不能用一套键鼠控制两个电脑呢?边做边学便有了这个小工具。记录下来,其中遇到的问题和解决方案。 通过electron + Vue + primevue...
学习

评论

请登录后发表评论

去登录
加载评论中...