macOS向けにElectronアプリケーションの署名(code signing)・公証(notarization)をする

ElectronアプリケーションのmacOS版を配布するためには、次の２つの方法があります。

1) Mac App Store
2) インターネット上で直接配布（例えば、GitHub releaseにファイルをアップロードする)

2)の方法で配布する場合、署名(code signing)および公証(notarization)が必要になります。この記事では、実際にElectronアプリケーションをリリースした経験をもとに、必要な設定について解説します。


# 前提
私が開発したElectronアプリケーション([Photo Location Map](https://tomoyukiaota.github.io/photo-location-map/))では、次の状態・条件から、リリースに向けて署名・公証に必要な設定をしました。

 - electron-builderを使ってdmgを生成する
 - dmgを直接インターネット上で配布する。（Mac App Storeではない。）
   - GitHub Releasesにpublishする設定にしています。


# 署名・公証なしの場合
署名・公証なしの場合、インターネット上からダウンロードしたアプリケーションを起動しようとすると、次のメッセージが出て、起動できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/7ffc3fc9-5ac4-70fb-ad46-fd5b3f443a04.png)

また、署名の設定をしていない場合、electron-builderでビルド時(`electron-builder build`)に、`skipped macOS application code signing`とメッセージが出ます。

```
  • electron-builder  version=21.2.0 os=19.0.0
  • loaded configuration  file=/Users/Tomoyuki/Documents/GitRepo/GitHub/photo-location-map/electron-builder.json
  • writing effective config  file=release/builder-effective-config.yaml
  • packaging       platform=darwin arch=x64 electron=7.0.0 appOutDir=release/mac
  • skipped macOS application code signing  reason=cannot find valid "Developer ID Application" identity or custom non-Apple code signing certificate, see https://electron.build/code-signing 
```

# 署名の設定をする
まずは署名が必要です。署名のためには次の２つが必要です。

1. Apple Developer Programに登録する。
2. XcodeでDeveloper ID Applicationを作成する。

Developer ID Applicationは、Xcodeを起動し、Preferencesから、次の画像の通りにすると作成できます。途中、Apple IDのユーザ名・パスワードを入力するポップアップが出てきますので、Apple Developer Program登録の際に紐つけたApple IDを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/330011c4-5633-7400-322e-e670854352c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/b5e60016-5d4f-1773-04b2-f2b15c2db73f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/98ed0943-e996-51d2-0c65-3450a88e68ab.png)

Developer ID Applicationを作成後は、electron-builderでビルド時に「Developer ID Applicationを使ってsignした」というメッセージが出るようになります。

```
  • electron-builder  version=21.2.0 os=19.0.0
  • loaded configuration  file=/Users/Tomoyuki/Documents/GitRepo/GitHub/photo-location-map/electron-builder.json
  • writing effective config  file=release/builder-effective-config.yaml
  • packaging       platform=darwin arch=x64 electron=7.0.0 appOutDir=release/mac
  • signing         file=release/mac/Photo Location Map.app identityName=Developer ID Application: Tomoyuki Aota 
```


# 署名済みかつ公証なしの場合

署名済みかつ公証なしの場合、インターネット上からダウンロードしたアプリケーションを起動しようとすると、次のメッセージが出て、起動できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/4dce89ac-cad3-3d5f-40e5-e9bab9b8c340.png)


# 公証の設定をする

公証の方法については、次のページを参考にしました。
[Notarizing your Electron application | Kilian Valkhof](https://kilianvalkhof.com/2019/electron/notarizing-your-electron-application/)

私が開発中のアプリケーションでは、次の変更が必要でした。
https://github.com/TomoyukiAota/photo-location-map/pull/192/files

Apple IDやApp Specific Passwordを指定する必要がありますが、これらは、環境変数に格納するようにしました。
https://github.com/TomoyukiAota/photo-location-map/pull/192/files#diff-55db2099c7a0eff7f93007cafce6c7ebR24-R25

```
    appleId: process.env.APPLE_ID, 
    appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
```

公証は５−１０分程度かかります。公証が終わるとアップルからメールが来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/6b7404a2-c6b1-1e23-aeff-9c9a7dd993d6.png)

ついでに、公証の結果を確認するスクリプトを入れておくと便利です。公証に時間がかかっている場合などの調査に役に立ちます。（[Notary Serviceが落ちている](https://github.com/electron/electron-notarize/issues/11#issuecomment-540443853)ことがあったりします。）　ターミナル上では、`xcrun altool --notarization-history 0 -u ${appleId} -p ${appSpecificPassword}` （`${appleId}`と`${appSpecificPassword}`はそれぞれ置き換える）なので、それをラップしたスクリプトを用意すればいいと思います。私の場合は先程の変更の中で、`script/notarize/get-notarization-history.js`というスクリプトを用意しました。


# 署名済みかつ公証済みの場合

インターネット上からダウンロードしたアプリケーションを起動すると、次のポップアップが出ます。アプリケーションが起動できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185010/62cf85ee-d50a-2dfa-e6d2-9cda412501be.png)


# おわりに

公証は[macOS 10.14.5やmacOS 10.15で必須とされた](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution)ので、2019年11月現在、必要な作業やライブラリ([electron-notarize](https://github.com/electron/electron-notarize))関連の設定など、まだ流動的な面があります。ですので、この記事に書かれていることに加えて、最新の情報を追うように心がけると良いと思います。