Apple公証をWindowsのみで完結する方法
まえがき
この記事は、macOSを手放してしまった筆者がふと 「あれ…?Tauriでアプリ作ったのは良いけど、Mac無しでどうやってmacOS版のアプリに公証を行えば良いんだ…?」 と疑問に思ったことをきっかけに調査した内容をまとめた備忘録的な内容となります。
最終的なゴールは 「Mac無しで公証有りのmacOSアプリを作成すること」 です。
なお、Electronを使用する場合にもほぼ同様ですので、TauriのみならずElectronでアプリを作る方にとっても使える内容かと思います。
PKCS(*.p12)を作成する
公証を行うには、PKCSファイル(*.p12)が必要で、これを手に入れる過程が一番面倒で大変でした。
流れとしては、Apple Developerのサイトで「Developer ID Application」の証明書を作成してPKCS形式へ変換していくのですが、その過程の細かな作業は以下のとおりです。
1. 証明書署名要求(CSR)を作成する
まず「Developer ID Application」証明書を作成するにあたり必要となる証明書署名要求ファイル(*.certSigningRequest)を作成します。
作成にはOpenSSLが必要です。
Windows10以降であれば、WSL(Windows Subsystem for Linux)が使えますのでWSL上で行ってもよいですし、Windows用のOpenSSLをインストールしてもOKです。いずれにせよ、openssl
コマンドが使える事が前提です。
なお、当記事ではWSL(OSはUbuntu22.04)を使う前提で記載します。
# RSAの秘密鍵を作成
openssl genrsa -out private.key 2048
# 秘密鍵を使って証明書署名要求を作成
openssl req -new -key private.key -out request.certSigningRequest -subj "/emailAddress=sample@example.com, CN=My Name, C=JP"
2. Developer ID Application証明書を発行する
Apple DeveloperのWebサイトへ移動し、Certificates
を開き、「+」ボタンで新規証明書の発行を開始します。
証明書のタイプは「Developer ID Application」を選択肢、画面右上のContinue
を押します。
前項で作成した証明書署名要求(CSR)ファイルをアップロードします。
*.certSigningRequest
ファイルを選択し、Continue
を押します。
下記の通りDeveloper ID Application証明書が発行されたら、Download
を押して証明書(*.cer)をダウンロードします。
3. 証明書(*.cer)をPKCS形式へ変換する
ダウンロードした証明書ファイルをPKCS形式(*.p12)へ変換します。
# CERファイルをPEM形式へ変換する
openssl x509 -in developerID_application.cer -inform DER -out developerID_application.pem -outform PEM
# 秘密鍵とPEMファイルからPKCSファイルを作成する
openssl pkcs12 -legacy -export -inkey private.key -in developerID_application.pem -out developerID_application.p12 -passin pass:<PASSPHRASE> -passout pass:<PASSPHRASE>
<PASSPHRASE>
は、適宜推測されにくいパスワードを指定してください。
(パスワードは後々使うので、セキュリティが確保されたところに保存するなど、適宜保管してください。)
これで、developerID_application.p12
というPKCS形式の証明書ファイルが得られました。
各種ファイルのファイル名は自由ですが、最終的にこのP12ファイルが得られれば準備完了です。
Github Wotkflowを作成する
作成したTauriアプリをGithubActionsでビルドするには、プロジェクトのルートディレクトリに.github/workflows
ディレクトリを作成し、作成したディレクトリ内にYAML形式でワークフローを作成する必要があります。
これについては、Tauriの公式ページにワークフローの例が載っており、そのとおりの内容で問題なく動作します。
実際のコード
name: 'publish'
on:
push:
branches:
- release
jobs:
publish-tauri:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- platform: 'macos-latest' # for Arm based macs (M1 and above).
args: '--target aarch64-apple-darwin'
- platform: 'macos-latest' # for Intel based macs.
args: '--target x86_64-apple-darwin'
- platform: 'ubuntu-22.04' # for Tauri v1 you could replace this with ubuntu-20.04.
args: ''
- platform: 'windows-latest'
args: ''
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- name: install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-22.04' # This must match the platform value defined above.
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.0-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
# webkitgtk 4.0 is for Tauri v1 - webkitgtk 4.1 is for Tauri v2.
# You can remove the one that doesn't apply to your app to speed up the workflow a bit.
- name: setup node
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'yarn' # Set this to npm, yarn or pnpm.
- name: install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
# Those targets are only used on macos runners so it's in an `if` to slightly speed up windows and linux builds.
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: './src-tauri -> target'
- name: install frontend dependencies
# If you don't have `beforeBuildCommand` configured you may want to build your frontend here too.
run: yarn install # change this to npm or pnpm depending on which one you use.
- uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version.
releaseName: 'App v__VERSION__'
releaseBody: 'See the assets to download this version and install.'
releaseDraft: true
prerelease: false
args: ${{ matrix.settings.args }}
Tauriアプリのビルドステップ
ワークフロー全体のうち、Tauriアプリをビルドするステップは以下のとおりです。
このステップでは、Tauri公式が提供するアクションtauri-apps/tauri-action
が使われており、ビルドだけでなく、matrix.platform
がmacOSの場合は指定された環境変数を使って公証も自動で行ってくれる便利なアクションです。
キーチェーンへの登録なども全て自動で行ってくれるので、このアクションの前段階でなにか準備をする必要もありません。
- uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version.
releaseName: 'App v__VERSION__'
releaseBody: 'See the assets to download this version and install.'
releaseDraft: true
prerelease: false
args: ${{ matrix.settings.args }}
環境変数の設定
tauri-apps/tauri-action
でAppleの公証を行う場合、以下の環境変数が必要となります。
これらの環境変数を、リポジトリのActions用のシークレット(Settings/Actions secrets and variables/Actions/Secrets)に設定していきます。
環境変数 | 設定値 |
---|---|
GITHUB_TOKEN | ワークフローの実行都度自動的に生成されるsecrets.GITHUB_TOKEN を設定する |
APPLE_CERTIFICATE | PKCSファイルの内容をBase64エンコードした文字列を設定する。 |
APPLE_CERTIFICATE_PASSWORD | PKCSファイル作成時に設定した<PASSPHRASE> を設定する。 |
APPLE_SIGNING_IDENTITY | 証明書の名前(Developer ID Application: Walter Tauri (xxxxxxxxxx) orxxxxxxxxxx )を設定する。(調べ方は後述します。) |
APPLE_ID | 自分のAppleID(メールアドレス)を設定する。 |
APPLE_PASSWORD | AppleID管理でアプリ用パスワードを発行して設定する。 |
APPLE_TEAM_ID |
AppleStoreConnectのユーザとアクセス で自分を選択し、チームID に記載されている10桁の文字列を指定する。 |
補足:APPLE_CERTIFICATEに設定する文字列の作り方
APPLE_CERTIFICATE二設定する値は、PKCSファイルの内容をBase64エンコードした文字列です。
Base64エンコードは以下で可能です。
# base64を使う場合
base64 -i developerID_application.p12 >> developerID_application.base64.txt
# OpenSSLを使う場合
openssl base64 -in developerID_application.p12 -out developerID_application.base64.txt
上記の結果、developerID_application.base64.txt
にPKCSファイルをBase64エンコードした文字列が出力されるので、それをAPPLE_CERTIFICATEに設定します。
補足:APPLE_SIGNING_IDENTITYの調べ方
APPLE_SIGNING_IDENTITYに設定する値は、macOSを使用している場合はキーチェーン上で簡単に確認することができます。しかし、今回はWindowsなのでそれができません。
検索しても、ここに設定する値はmacOSを使っている前提でキーチェーンを使って確認する方法ばかり…
困り果てChatGPTさんに聞いてみたところ、以下のコマンドで確認することができました。
# PKCSファイルの内容を出力する
openssl pkcs12 -info -in "developerID_application.p12"
上記のコマンドの結果出力される情報のうち、subject
フィールドのCN=
に続いて出力されている情報がAPPLE_SIGNING_IDENTITYに設定する文字列となりますので、そのままAPPLE_SIGNING_IDENTITYに設定します。
(Developer ID Application: My Name (ABCDE12345)
の形式で出力されているはずです。)
最終的に以下のようになります。
上述の通りsecrets.GITHUB_TOKEN
はワークフロー実行都度、Github側で自動的に設定するのでこの画面には現れていません。
※むしろ、ここでGITHUB_TOKENを作成しないようにしてください。
これで、GithubActionsを使ってTauriアプリを公証有りでビルドする準備は整いました。
あとは作成したワークフローをリモートリポジトリへプッシュし、稼働条件に沿ったタグを作成するとワークフローが稼働し、公証済みのMacOSアプリが作成されるはずです。
トラブルシューティング
Built application at: /Users/runner/work/<APPNAME>/<APPNAME>/src-tauri/target/x86_64-apple-darwin/release/<APPNAME>
Bundling <APPNAME>.app (/Users/runner/work/<APPNAME>/<APPNAME>/src-tauri/target/x86_64-apple-darwin/release/bundle/macos/<APPNAME>.app)
Signing with identity "***"
Error failed to bundle project: failed to import keychain certificate
Error: Command failed with exit code 1: npm run tauri build -- --target x86_64-apple-darwin
上記のエラーが発生した場合、PKCSを作成した際に-legacy
オプションを付け忘れている可能性があります。再度PKCSを作成し直して、リトライしてください。
さいごに
以上でMacを持っていない方でもGithubActionsと手元のパソコンを使って、公証済のmacOS向けTauriアプリをビルドすることができるはずです。
「macOS版も提供したいけど、そのためにMac買うのもなぁ…」という方はぜひお試しください。
Discussion