electronr进行签名与公证

windows:javascript

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

   "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"
    },        

主要参数说明:linux

 'arch:表明须要打包的位数,win64表明打包64位的,ia32表明打包32位的,最好分开打包,由于一块儿打包的话最后出来的包是正常开发包的两倍。npm

'signingHashAlgorithms':表明加密的方式,通常分为'sha256'与'sha1'两种方式,都进行加密便可。json

'rfc3161TimeStampServer':表明时间戳,通常使用'http://timestamp.digicert.com'来进行时间戳的覆盖便可vim

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

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

 

2.导出pfx格式的证书安全

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

 

 

 

问题:

可是有个最大的问题就是,没法进行导出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
    }
  }

  

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

相关文章
相关标签/搜索