zoukankan      html  css  js  c++  java
  • electronr进行签名与公证

    windows:

    1.设置package.json的有关window打包的相关内容

       "win": {
          "icon": "build/icons/icon.ico",
          "target": [
            {
              "target": "nsis",
              "arch": [
                "x64",
                "ia32"
              ]
            }
          ],
          "verifyUpdateCodeSignature": false,
          "signingHashAlgorithms": [
            "sha256",
            "sha1"
          ],
          "signDlls": true,
          "rfc3161TimeStampServer": "http://timestamp.digicert.com",
          "certificateFile": "xxx.pfx",
          "certificatePassword": "xxxxxx"
        },        
    

    主要参数说明:

     'arch:代表需要打包的位数,win64代表打包64位的,ia32代表打包32位的,最好分开打包,因为一起打包的话最后出来的包是正常开发包的两倍。

    'signingHashAlgorithms':代表加密的方式,一般分为'sha256'与'sha1'两种方式,都进行加密即可。

    'rfc3161TimeStampServer':代表时间戳,一般使用'http://timestamp.digicert.com'来进行时间戳的覆盖即可

    'certificateFile':证书的地址,必须位pfx格式(如何导出会在第二步的时候进行讲解)

    'certificatePassword':证书的私钥密码,这个在配置证书的时候进行设置(第二步进行讲解)

    2.导出pfx格式的证书

    windows的证书需要去有相关资质的商家进行购买,我是在数安时代购买的,现在买的证书都是以签名狗(类似与银行的u盘)的方式进行发放,确保了安全性的问题。在插上签名狗的时候,会自动下载一个证书管理工具软件,在上面可以可以修改密码,即上面第一步certificatePassword参数的值。

    问题:

    但是有个最大的问题就是,无法进行导出pfx证书,只能导出cer格式的不带私钥的证书。它可以对已经打包完的exe进行签名,很明显这对electron来说是不合适的。对打包完的exe进行签名,会导致无法升级的问题,所以需要在打包的时候就将证书打进去。

    解决方法:

    打开数安时代的软件(本地未插签名狗,如果插入,此地会出现购买的证书),右键证书,导出cer格式的证书,然后修改后缀名为pfx,如导出的为test.cer,修改后缀名为test.pfx,放到项目的根目录下面,第一步的certificateFile修改为'test.pfx'即可(当然,test只是个例子,名字自定义)

    3.进行打包

    这个时候,windows上的签名已经可以了,运行你的打包命令吧!

    npm run build
    

     由于我们导出的是不带私钥的pfx证书,所以在打包过程中会弹出弹窗提示你需要输入密码,输入你在第二步的密码即可。全程中不能拔下来你的签名狗,不然签名会断开。

     运行成功之后,在你的打包出来的exe上进行右击属性,即可看到签名成功:

     

    macOS:

    1.制作本地CSR文件:

       首先你得需要一个appleId的账号,登陆在你的mac上,然后进入钥匙串访问(在启动台打开),打开证书助理--->从证书办法机构请求证书

     这个时候会出现证书助理的弹窗,选择存储到U盘,输入自己常用的email地址即可,点击继续

     最后会生成一个CSR的文件,这个文件就是我们接下来需要的东西,我把它放到了桌面

    2.生成Developer ID Application证书

      登陆 https://developer.apple.com/account/resources/certificates/add 这个地址,然后生成你的Developer ID Application证书 ;

      首先点击Certificates,选择添加

     选择Developer ID Application类型的证书,这里需要注意的是,electron打包的桌面应用必须试用这个证书。

     然后开始选择CSR文件,就是第一步导出的文件

     导入完毕之后,你就可以看到自己生成证书的信息了,黄色箭头指向的信息为提示14.10.5以及以上系统需要去公证,公证的步骤下面说,最后点击下载即可:

     

     3.将生成的证书导入到钥匙串中

    点击证书,自动添加到了钥匙串中,在钥匙串中进行访问:

     右击,查看详情,然后设置信任为始终信任:

     至此,证书在钥匙串里面已经设置完毕,导出为p12文件

     导出文件的路径要记住,因为我们下一步设置环境变量需要用到

     

     4.生成Identifiers,获取BundleId

    点击网址左侧的Identifiers选项,进行添加

     选择App ID进行添加

     这个时候会让你自定义名称,按照他的提示自定义一下,如 com.mac.test,这个要记住,因为后面我们要用它来配置package.json

     5.配置环境变量

    如果不配置环境变量的话,在mac是electron是无法获取到本地的证书的,所以,打开你的终端(mac的终端命令和LINUX很相似)

    输入:

    sudo vim ~/.bash_profile
    

    进入配置环境变量;

    继续输入:

    export CSC_LINK = ~/zs/mac.p12
    

    这行命令是为了寻找你的p12证书,然后加入到环境变量中,zs/mac.p12为第三步导出的证书的绝对地址

    然后按键盘上的esc建进行退出;

    在终端上继续输入:

    :qw
    

     

    source ~/.bash_profile
    

     进行重载环境变量

    输入

    env
    

     查看环境变量配置的结果:

     注意:如果配置完成之后,多次重载都发现环境变量不能正确更新到列表中,这时应该先退出终端,然后再登录终端查看环境变量即可看到更新完成。

    6.进行公证

    其实到第五步,运行命令

    npm run build
    

     

    是没有任何问题的,也是可以进行升级的操作。(这个地方记得要把app拖到Applications中之后,再在程序坞中打开,不然无法进行升级)

    注意:通过钥匙串的方式进行代码签名,进而实现自动更新之后,appId应一致,打包应用后不能随意更改新的appId字段。否则会被认为是两个不同的应用而无法更新。

    但是从MacOS 10.14.5开始,所有“新”开发人员签名的App都需要进行公证(Notarization),否则将触发苹果的Gatekeeper,阻止用户安装你的App。这意味着,除了对 App 进行签名,还需要对其进行公证。如果你尝试启动应在MacOS 10.14.5上未经公证的Appp,则会看到以下的错误消息:

     这是因为mac为了保证安全,对除App Store以外的应用进行公证,以确保没有恶意代码,相关内容在这里:https://support.apple.com/zh-cn/HT202491?_blank

    官方文档给的方法是用xcode提交到苹果的公证处进行公证,但是这方法对于electron来说是不合理的,electron所做的是打包的时候就把一切问题解决了,所以,还是需要在打包的根源上寻找解决方法:

    1.安装electron-notarize

    运行命令:

    npm i electron-notarize --save-dev
    

    2.使用hardened runtime构建App

    在添加公证时,苹果偷偷加入了一项要求,即App的 runtime 必须是 hardened runtime ,这在默认情况下会减少应用程序的权限。这不一定是坏事,但还有一件事需要考虑。

    在一个 hardened runtime 中App需要两件事:

    • 在 electron-builder的 mac配置选项中设置 "hardenedRuntime": true ;
    • 设定正确的权限。

    如果运行 hardened runtime 时,则至少设置一个非常重要的权限:“allow-unsigned-executable-memory”。您可以在此处指定更多权限,但这是Electron App所需的唯一权限。我在public文件夹下新建名为entitlemets.mac.plist的文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
      <dict>
        <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
        <true/>
      </dict>
    </plist>
    

    在 electron-builder的 mac配置选项中,需要将entitlementsentitlementsInherits的值同时设置为上述文件的路径。通过entitlementsInherits这个配置可以授予Electron在内部访问权限文件时相同的权限。

    "mac": {
      "entitlements": "build/entitlements.mac.plist",
      "entitlementsInherit": "build/entitlements.mac.plist"
    },
    

    3.使用有效的开发者ID进行签名

    只有当你的 Mac上安装了有效的开发人员ID时,才能对App进行公证。Electron-bulder将自动从钥匙串中获取一个有效 ID 进行签名。这就需要你有一个Apple的开发者账号。关于这一点,不再赘述。

    但是,electron-builder使用的签名工具(electronic -osx-sign)会进行完整性检查以验证签名是否成功。在MacOS 10.14.5之前,这个完整性检查将返回True,但在MacOS 10.14.5 中,它会返回False。因为虽然签名进行完毕了,但应用程序还没有公证信息,所以会返回错False。

    所以我们需要禁用这种完整性检查。你可以通过在electron-builder的mac配置中设置“gatekeeperAssess”:false来实现。

    最后,我们来看下 mac 参数的配置情况吧:

    "mac": {
      "hardenedRuntime" : true,
      "gatekeeperAssess": false,
      "entitlements": "build/entitlements.mac.plist",
      "entitlementsInherit": "build/entitlements.mac.plist"
    },
    

      

    4. 使用electron-notarize公证App

    接下来则是关于公证的部分。我们使用的工具叫 Electron-notarize 。因为只需要在开发阶段使用,因此请将其安装到 devDependency。

    这个工具可以完成公证的所有工作:将App打包并上传到Apple的服务器,等待公证成功,然后给App加入公证信息。这些流程是异步发送的,构建过程会增多不少时间。

    App应该在签名之后,打包成DMG之前进行公证。Electron-builder 有一个afterSign的钩子,通过执行对应的 js 文件。这个配置选项在“build”配置中。

    "build": {
      "afterSign": "scripts/notarize.js"
    }
    

      notarize.js代码如下:

    const { notarize } = require('electron-notarize');
    
    exports.default = async function notarizing(context) {
      const { electronPlatformName, appOutDir } = context;  
      if (electronPlatformName !== 'darwin') {
        return;
      }
    
      const appName = context.packager.appInfo.productFilename;
    
      return await notarize({
        appBundleId: 'com.yourcompany.yourAppId',
        appPath: `${appOutDir}/${appName}.app`,
        appleId: '',
        appleIdPassword: '',
      });
    }
    

      

    我们只需要签署MacOS,所以如果我们不在darwin(macOS的内部名称)上,我们返回并且不运行公证代码。

    为了更好的安全性,请考虑使用此处概述的MacOS钥匙串:使用appleIdPassword时的安全性。

    说到用户凭证。这是您的Apple ID,但是您需要生成一个特定于应用程序的密码(所以不要使用常规密码!)你可以在appleid.apple.com上创建一个。

    5. 不要对dmg签名

    在版本20.43.0之前,electronic -builder还签署了您的DMG安装程序。这实际上不是一个问题,但是在新的公证规则下,任何签署的东西都需要公证。

    但是,如果对DMG安装包签名并公证,它实际上会触发之前看到的错误。这可能是 Apple 审核逻辑中的一个错误。既然这个错误存在,我们必须要使用未经过公证的DMG文件。Apple的Gatekeeper可以检测到DMG中的经过公证的.app文件,并且可以让用户正常打开App。

    从electronic -builder 20.43.0开始,默认情况下DMG是无签名的。您可以通过在“dmg”配置中添加“sign”:false来显式地处理这种行为:

    "dmg": {
      "sign": false
    },
    

      

    看一下最终的配置信息:

     "build": {
        "afterSign": "scripts/notarize.js",
        "productName": "",
        "appId": "******",
        "directories": {
          "output": "build"
        },
        "publish": [
          {
            "provider": "generic",
            "url": "******"
          }
        ],
        "files": [
          "dist/electron/**/*"
        ],
        "dmg": {
          "sign": false,
          "contents": [
            {
              "x": 410,
              "y": 150,
              "type": "link",
              "path": "/Applications"
            },
            {
              "x": 130,
              "y": 150,
              "type": "file"
            }
          ]
        },
        "mac": {
          "hardenedRuntime": true,
          "gatekeeperAssess": false,
          "entitlements": "build/entitlements.mac.plist",
          "entitlementsInherit": "build/entitlements.mac.plist",
          "icon": "build/icons/icon.icns"
        },
        "win": {
          "icon": "build/icons/icon.ico",
          "target": [
            {
              "target": "nsis",
              "arch": [
                "ia32"
              ]
            }
          ],
          "verifyUpdateCodeSignature": false,
          "signingHashAlgorithms": [
            "sha256",
            "sha1"
          ],
          "signDlls": true,
          "rfc3161TimeStampServer": "http://timestamp.digicert.com",
          "certificateFile": "sa.pfx",
          "certificatePassword": "Sp123456"
        },
        "linux": {
          "icon": "build/icons"
        },
        "nsis": {
          "perMachine": false,
          "oneClick": false,
          "allowElevation": true,
          "allowToChangeInstallationDirectory": true,
          "installerIcon": "build/icons/icon.ico",
          "uninstallerIcon": "build/icons/icon.ico",
          "installerHeaderIcon": "build/icons/icon.ico",
          "createDesktopShortcut": true,
          "createStartMenuShortcut": true
        }
      }
    

      如果,在公证的时候出现了这个报错:

    electron you must first sign the relevant contracts online

    那你需要到你申请appid的网站上进行登陆一下,有个协议,同意一下即可。

     如此,mac和window的签名以及公证就全部完毕了。

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/mmykdbc/p/11468908.html
Copyright © 2011-2022 走看看