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的簽名以及公證就所有完畢了。

相關文章
相關標籤/搜索