5.5 KiB
title | date |
---|---|
Electronアプリをコード署名してApple 公証 (Notary) を通過する手順 | 2019-06-05 00:00:00 +09:00 |
electron-builder を利用して macOS 向け Electron アプリをコード署名し、公証を通過させます。
Code Sign
アプリのコード署名はelectron-builder
によって自動で行われます。内部的にはelectron-osx-signが使用されます。
リリース用のアプリにコード署名をするには、Keychain に有効な Developer ID Certificate が格納されている必要があります。macOS Developer Certificate は開発用のコード署名のみ可能なので、アプリを配布する場合には必ず Developer ID Certificate が必要です。
まだ証明書を発行していない場合は、Apple Developerで証明書の追加ウィザードに進み、Developer ID Applicationを選択して証明書を発行してください。
Notarize
コード署名済みのアプリをelectron-notarizeを使用して Apple Notary Service に提出します。
const { notarize } = require('electron-notarize')
notarize({
appBundleId,
appPath,
appleId,
appleIdPassword,
ascProvider,
})
- appBundleId: アプリの Bundle ID です。
package.json
のbuild.appId
と同じものを使います。 - appPath:
.app
の絶対パスを指定します。 - appleId: Apple Developer として登録している Apple ID を指定します。
- appleIdPassword: Apple ID のパスワードです。2 要素認証を必要としないパスワードが必要なので、Apple IDにアクセスしてApp-specific Passwordを発行してください。
- ascProvider: Apple Developer の Membership に記載されているTeam IDを指定します。
electron-builder の afterSign フック
electron-builder の afterSign フックを使用して、コード署名が済んだアプリを自動で Notary に提出します。
フックスクリプトを./scripts/after-sign-mac.js
に置きます。
const path = require('path')
const { notarize } = require('electron-notarize')
const appleId = process.env.APPLE_ID
const appleIdPassword = process.env.APPLE_PASSWORD
const ascProvider = process.env.ASC_PROVIDER
const configPath = path.resolve(__dirname, '../package.json')
const appPath = path.resolve(__dirname, '../dist/mac/App.app')
const config = require(configPath)
const appBundleId = config.build.appId
async function notarizeApp() {
console.log(`afterSign: Notarizing ${appBundleId} in ${appPath}`)
await notarize({
appBundleId,
appPath,
appleId,
appleIdPassword,
ascProvider,
})
console.log('afterSign: Notarized')
}
exports.default = async () => {
await notarizeApp()
}
package.json
のbuild
にafterSign
を追加してコード署名が終わった後にスクリプトが実行されるようにします。
"build": {
"afterSign": "./scripts/after-sign-mac.js"
}
Enable Hardened Runtime
このままでは公証に失敗します。デフォルトで書き出されるバイナリでは、セキュリティの強化されたHardened Runtimeが有効になっていないためです。以下のようなエラーメッセージを貰います。
{
"status": "Invalid",
"statusSummary": "Archive contains critical validation errors",
"statusCode": 4000,
"issues": [
{
"severity": "error",
"code": null,
"path": "App.zip/App.app/Contents/MacOS/App",
"message": "The executable does not have the hardened runtime enabled.",
"docUrl": null,
"architecture": "x86_64"
},
}
}
package.json
のbuild.mac.hardenedRuntime
をtrue
にして Hardened Runtime を有効にすることでこの問題を解決します。
"build": {
"mac": {
"hardenedRuntime": true
}
}
詳細
- https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/resolving_common_notarization_issues
- https://github.com/electron-userland/electron-builder/issues/3383
Verify Notary Status
ただしく公証を得られたかどうかはaltool
で調べることができます。
公証通過後に送られてくるメールにRequest Identifier
が記載されているのでメモします。
Dear Yasuaki,
Your Mac software has been notarized. You can now export this software and distribute it directly to users.
Bundle Identifier: <Bundle ID>
Request Identifier: <UUID>
For details on exporting a notarized app, visit Xcode Help or the notarization guide.
Best Regards,
Apple Developer Relations
xcrun altool --notarization-info
コマンドに UUID と Apple ID、パスワードを指定して公証ステータスを確認します。
xcrun altool --notarization-info <UUID> -u $APPLE_ID -p $APPLE_PASSWORD
正しく公証が得られている場合は以下のようなメッセージが表示されます。おめでとうございます!
2019-06-05 13:51:18.236 altool[5944:261201] No errors getting notarization info.
RequestUUID: <UUID>
Date: 2019-06-05 04:45:54 +0000
Status: success
LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/Enigma123/v4/<Log file identifier>
Status Code: 0
Status Message: Package Approved