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須要兩件事:
若是運行 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
配置選項中,須要將entitlements
和entitlementsInherits
的值同時設置爲上述文件的路徑。經過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的簽名以及公證就所有完畢了。