zoukankan      html  css  js  c++  java
  • 公司只提供签名服务,不提供证书文件,如何打包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: 'HikLink',
      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: 'HikLink',
      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里的代码改写了,就为了满足签名的要求,真是一把辛酸泪

  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/liulun/p/14079027.html
Copyright © 2011-2022 走看看