🪪

Apple公証をWindowsのみで完結する方法

2024/08/17に公開

まえがき

この記事は、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