🧚

MacでStore外でアプリ配布のためのコード署名・公証のBashスクリプト

2024/07/03に公開

Macでアプリを配布するときにコード署名・公証をしないとセキュリティでインストールが難しいためコード署名をします。
ここでは、説明は他のページに任せて実際に使用しているコード署名・公証用のbashを置いておきます。
pkgで配布ではなく、dmgでの配布用スクリプトとなります。

自分自身はUnityのアプリを署名していますが特にUnityでなくても利用できると思います。
(ちなみにUnityの公式の説明は情報が古くあまり役に立たない気がします。どうして...)

概要

Macアプリとその他の配布物とまとめてdmgファイルにまとめます。
アプリに署名、dmgファイルに署名・公証・公証の埋め込みを行います。

前提条件

1.Apple developer programに入っていること。
2.その上でDeveloper ID Applicationの証明書を作ってxcodeからダウンロードされていること。
※ダウンロードされた証明証はkeychainに入っています。
3.アプリ用パスワード(App Specific Password)を用意すること。
4.アプリの機能やセキュリティの設定ファイルの拡張子がentitlementsのファイルを作ること。
5.配布物が揃っていること。

※1.〜4.について、この記事では説明しないので下のリンクのページがわかりやすいと思います。
https://zenn.dev/aidiot_dev/articles/20240111-macos-notarization

使い方

スクリプトの上の方の設定情報を編集し、その下で配布物をfolderにまとめるためのcp(コピー)やrm(削除)コマンドを書きます(書かずにあらかじめコピーしても問題ないです。)。

そして実行します。

処理の流れ

準備

1.配布物をフォルダーまとめる。
2.appへのコード署名をする。
3.app内のファイルの権限をdmgをつくれるように変更する。
4.Applicationへのリンクを作る(インストール時のドラッグ&ドロップ用)。

署名・公証

5.Appにコード署名する。
6.そのAppを含んだdmgファイルを作成する。
7.dmgファイルへの署名をする。
8.dmgファイルを公証(Notarization)する。
9.dmgファイルに公証情報を埋め込む(stapler)。
10.うまく行ったかチェックする。

#!/bin/bash
set -e

echo "* Settings"

#配布物をまとめたInput folder
InputPath="path/to/original/"

#配布物をまとめたInput Folder上にあるアプリ
AppFileName="my_app.app"

#Input folder上のアプリのentitlements
#(アプリが利用する機能や権限のファイル。xcodeで作成できます。)
EntitlementsFilePath="my_app.entitlements"

#dmgファイルが作成される Folder
OutputPath="output/package/path"

#dmgファイル名
OutputDMGFilename="my_app.dmg"


#開発者証明書の名前(KeyChainに保存されている証明書。XXXXXXXXXXはTeamID)
DeveloperCertificationName="Developer ID Application: your name (XXXXXXXXXX)"

#公証用のログイン情報
AppleID="your-name@example.com"
AppSpecificPassword="xxxx-xxxx-xxxx-xxxx"
TeamID="XXXXXXXXXX"

#作成するdmgのボリューム名。
VolumeName="my_app"

#変数定義
echo "* Make variables" 
AppFilePath="${InputPath}${AppFileName}"
OutputDMGFilePath="${OutputPath}${OutputDMGFilename}"

echo "Create Input Directory"
#ここでInputPathに配布するファイルを集める。
#InputPath内にアプリをコピーしたりreadmeをコピーしたりする。


#dmgファイルにDrag and Drop用のApplicationへのリンクを作る。
echo "* Create Link to Applications"
rm -f "${InputPath}Applications"
ln -s "/Applications" "${InputPath}Applications"

#権限を変える。(変えないとdmgの作成でエラーになります。)
echo "* Change Permissions"
chmod -R u+w "${InputPath}${AppFileName}" 

#Appへのコード署名をする
echo "* Codesigning"
codesign \
    --deep \
    --force \
    --verify \
    --verbose \
    --timestamp \
    --options runtime \
    --entitlements "${EntitlementsFilePath}" \
    --sign "${DeveloperCertificationName}" \
    "${AppFilePath}"

#DMGファイルの作成
echo "* Create DMG File"
rm -f "${OutputDMGFilePath}"
hdiutil create -srcfolder "${InputPath}" \
    -fs HFS+ -format UDZO -volname "${VolumeName}" \
    "${OutputDMGFilePath}"

#dmgへの署名
echo "* Sign DMG File"
codesign --sign "${DeveloperCertificationName}" \
    --timestamp --options runtime "${OutputDMGFilePath}"

#Appleの公証を行う
echo "* Notary DMG File"
Xcrun notarytool submit "${OutputDMGFilePath}" \
    --apple-id "${AppleID}" \
    --password "${AppSpecificPassword}" \
    --team-id "${TeamID}" --wait

#公証情報を埋め込む。ネットがなくても公証済み確認ができるようになる。
echo "* Stapler DMG File"
xcrun stapler staple "${OutputDMGFilePath}"

#チェック用
echo "* Check Install"
spctl -a -t install -v "${OutputDMGFilePath}"

その他

dmgファイルは色々とカスタマイズできるようだがここでは説明していない。
以下の記事を参考のこと。
https://qiita.com/econa77/items/d0e7d3a75d8fd3bb7777

Discussion