公司只提供签名服务,不提供证书文件,如何打包Electron应用
需求
稍微正规点的公司,都要为自己开发的软件做代码签名,如下图所示
代码签名的主要目的是为了确保软件的来源(这个软件是由谁生产的)和软件的内容不被篡改
一个软件公司可能有很多团队,很多开发者,开发不同的软件,但用于签名的证书就那么一套
由于担心开发者用这个证书去签名恶意的软件,损坏公司的声誉,
所以这套证书一般不会直接给开发者使用的
那么怎么办呢?
公司往往会开发一个服务,
软件开发好后,开发者把软件上传到这个服务上,由这个服务给软件签名,签完名后,开发者再下载签名后的文件,再分发给用户
方案
如果公司提供的签名服务是标准的CI签名服务,那么开发者只要为electron-builder设置CSC_LINK和CSC_KEY_PASSWORD环境变量即可
但往往公司提供的就是一个简单的http上传下载服务,
这就需要通过自定义electron-builder的签名回调来完成相应的工作了
下面是这个配置项在整个electron-builder配置项中的位置(此文签名只与windows环境有关):
let options = { config: { win: { sign: async (config) => { } }, }, } builder.build(options);
在electron-builder为应用打包时,
至少会产出4个可执行文件(windows平台下为exe文件)
- 你的应用程序.exe
- 你的应用程序的安装文件.exe
- 你的应用程序的卸载文件.exe
- elevate.exe(这个文件用于以管理员的身份启动程序)
上面提到的sign函数会相应的执行8次(每个exe文件产生时,会执行两次sign函数)
如果你有其他的可执行程序要打包到你的应用中,
相应的sign函数也会被调用(同样也是每个exe文件,会执行两次sign函数)
sign函数被调用时,electron-builder会为其输入一个config参数
这个参数的值如下(两个对象分别对应两次调用):
{ path: 'D:\\project\\***\\*** 1.3.0.exe', name: 'yourApp', site: null, options: { icon: '../resource/unrelease/icon.ico', target: [ [Object] ], sign: [AsyncFunction: sign] }, hash: 'sha1', isNest: false, computeSignToolArgs: [Function: computeSignToolArgs] } { path: 'D:\\project\\***\\*** 1.3.0.exe', name: 'yourAPP', site: null, options: { icon: '../resource/unrelease/icon.ico', target: [ [Object] ], sign: [AsyncFunction: sign] }, hash: 'sha256', isNest: true, computeSignToolArgs: [Function: computeSignToolArgs] }
不同点是:hash和isNest两个属性
(有两种签名类型,一种是sha1,一种是sha256,sha1由于不安全,基本已经废弃了,所以我们选择sha256)
最终的sign函数的逻辑为:
child_process.spawnSync("curl.exe", [ "-F", "auth_id=******", "-F", "username=******", "-F", "fd=sha256", "-F", "file=@" + config.path, //生成的exe文件的绝对路径 "-F", "cert_type=SHA256", "http://******/sign.php", //签名服务 "-k", "-f", "-o", config.path //签名完之后就下载,下载之后就覆盖 ], { cwd: path.dirname(config.path), stdio: "inherit" //上传下载过程同步到当前控制台 })
我们是使用著名的curl.exe完成这个工作的
当然可以自己写代码模拟表单提交过程
PS
如果公司需要把所有的exe和dll都签名,那么就需要另外想办法了
我曾经把electron-builder里的代码改写了,就为了满足签名的要求,真是一把辛酸泪
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2011-12-08 WinForm企业应用框架设计【四】动态创建业务窗体