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

  • 相关阅读:
    使用fiddler2抓取手机发出的请求信息
    HTML转义字符集合
    spm3安装和使用
    JSP
    Servlet
    Struts2
    java多线程-消费者和生产者模式
    java异常处理机制(try-catch-finally)
    java内部类
    java上转型和下转型(对象的多态性)
  • 原文地址:https://www.cnblogs.com/liulun/p/14079027.html
Copyright © 2020-2023  润新知