コード署名
あらゆるプラットフォームで Wails アプリケーションに署名するためのガイド
アプリケーションのコード署名
このガイドでは、macOS、Windows、Linux 向けの Wails アプリケーションに署名する方法を説明します。Wails v3 には、コード署名、公証、PGP キー管理のための CLI ツールが組み込まれています。
- macOS - macOS アプリケーションへの署名と公証
- Windows - Windows の実行ファイルとパッケージへの署名
- Linux - PGP キーによる DEB および RPM パッケージへの署名
クロスプラットフォーム署名マトリックス
次のマトリックスは、各ソースプラットフォームから署名できる対象を示しています。
| 対象形式 | Windows から | macOS から | Linux から |
|---|---|---|---|
| Windows EXE/MSI | ✅ | ✅ | ✅ |
| macOS .app バンドル | ❌ | ✅ | ❌ |
| macOS の公証 | ❌ | ✅ | ❌ |
| Linux DEB | ✅ | ✅ | ✅ |
| Linux RPM | ✅ | ✅ | ✅ |
署名バックエンド
Wails は、利用可能な最適な署名バックエンドを自動的に選択します。
| プラットフォーム | ネイティブバックエンド | クロスプラットフォームバックエンド |
|---|---|---|
| Windows | signtool.exe(Windows SDK) |
組み込み |
| macOS | codesign(Xcode) |
利用不可 |
| Linux | 該当なし | 組み込み |
ネイティブプラットフォーム上で実行する場合、Wails は互換性を最大限に確保するため、ネイティブツールを使用します。クロスコンパイル時には、組み込みの署名サポートを使用します。
クイックスタート
署名を最も短時間で設定する方法は、セットアップウィザードを使用することです。
wails3 setup
これにより、共有の署名設定が ~/.config/wails/defaults.yaml に書き込まれ、 すべてのプラットフォームで署名時に使用されます(設定の優先順位を参照)。 この署名手順では、次の処理を行います。
- 対象とするプラットフォーム向けの署名ツールがインストールされているかを、どのホストからでも検出し、使用中の OS に対応するインストールコマンド(例:
brew install gnupg、sudo apt install osslsigncode、winget install GnuPG.Gpg4win)を表示します。 - macOS では、キーチェーン内の Developer ID 証明書を一覧表示します。
- Linux 向けの署名では、GPG キーを一覧表示し、新しいキーを生成してエクスポートできます。
- Windows 向けの署名では、OpenSSL を使用して(テスト用の)自己署名証明書を生成できます。
- パスワードをシステムのキーチェーンに安全に保存します(Taskfile には保存しません)。
設定の優先順位
署名タスクを実行すると、各署名オプションは次の順序で解決されます(最初に 一致した値が使用されます)。
wails3 tool signに明示的に渡されたフラグ(例:--pgp-key、--certificate、--identity)。- 対応するプロジェクトの Taskfile 変数(
PGP_KEY、SIGN_CERTIFICATE/SIGN_THUMBPRINT、SIGN_IDENTITY、…)。 ~/.config/wails/defaults.yaml内のグローバル設定(wails3 setupによって書き込まれます)。
つまり、Taskfile 変数は任意の上書き設定です。変数が未設定の場合は、 グローバルに設定されたキー、証明書、または ID が使用されます。3 つのいずれにも 値がない場合、sign コマンドは設定方法を示す明確なエラーを報告します。
プロジェクト単位の設定
グローバルではなく単一のプロジェクトに署名を設定するには、プロジェクト内からプロジェクト単位の ウィザードを実行します。これにより、vars がそのプロジェクトの build/<platform>/Taskfile.yml ファイルに書き込まれます。
wails3 setup signing # all detected platforms
wails3 setup signing --platform windows --platform linux
手動設定
または、プラットフォーム固有の Taskfile を手動で編集できます。各ファイルの先頭にある vars セクションを編集します。
build/darwin/Taskfile.yml を編集します。
vars:
SIGN_IDENTITY: "Developer ID Application: Your Company (TEAMID)"
KEYCHAIN_PROFILE: "my-notarize-profile"
# ENTITLEMENTS: "build/darwin/entitlements.plist"次に実行します。
wails3 task darwin:sign # Sign only
wails3 task darwin:sign:notarize # Sign and notarize
build/windows/Taskfile.yml を編集します。
vars:
SIGN_CERTIFICATE: "path/to/certificate.pfx"
# Or use thumbprint instead:
# SIGN_THUMBPRINT: "certificate-thumbprint"
# TIMESTAMP_SERVER: "http://timestamp.digicert.com"パスワードはシステムのキーチェーンから取得されます(設定するには wails3 setup signing を実行してください)。
次に実行します:
wails3 task windows:sign # Sign executable
wails3 task windows:sign:installer # Sign NSIS installer
build/linux/Taskfile.ymlを編集します:
vars:
PGP_KEY: "path/to/signing-key.asc"
# SIGN_ROLE: "builder" # Options: origin, maint, archive, builderパスワードはシステムのキーチェーンから取得されます(設定するにはwails3 setup signingを実行してください)。
次に実行します:
wails3 task linux:sign:deb # Sign DEB package
wails3 task linux:sign:rpm # Sign RPM package
wails3 task linux:sign:packages # Sign all packages
システムから署名の状態を直接確認することもできます:
# List available macOS code-signing identities
security find-identity -v -p codesigning
# List PGP keys (Linux package signing)
gpg --list-keys
すべてのプラットフォームの署名設定を対話形式で行うには、ウィザードを使用します:
wails3 setup signing
macOSコード署名
前提条件
- Apple Developerアカウント(年間$99)
- Developer ID Application証明書
- Xcode Command Line Toolsがインストール済みであること
署名ID
利用可能な署名IDを確認します:
security find-identity -v -p codesigning
出力:
Found 2 signing identities:
Developer ID Application: Your Company (ABCD1234) [valid]
Hash: ABC123DEF456...
Apple Development: your@email.com (XYZ789) [valid]
Hash: DEF789ABC123...設定
build/darwin/Taskfile.ymlを編集し、署名用の変数を設定します:
vars:
SIGN_IDENTITY: "Developer ID Application: Your Company (TEAMID)"
KEYCHAIN_PROFILE: "my-notarize-profile"
ENTITLEMENTS: "build/darwin/entitlements.plist"| 変数 | 必須 | 説明 |
|---|---|---|
SIGN_IDENTITY |
はい | Developer ID(例:「Developer ID Application: Your Company (TEAMID)」) |
KEYCHAIN_PROFILE |
公証に必要 | 認証情報が保存されたキーチェーンプロファイル名 |
ENTITLEMENTS |
いいえ | エンタイトルメントファイルへのパス |
次に実行します:
wails3 task darwin:sign # Build, package, and sign
wails3 task darwin:sign:notarize # Build, package, sign, and notarize
エンタイトルメント
エンタイトルメントは、アプリがアクセスできる機能を制御します。Wailsアプリでは通常、開発環境と本番環境で異なるエンタイトルメントが必要です:
- 開発:JIT、未署名メモリ、およびデバッグ用のエンタイトルメントが必要です
- 本番:最小限のエンタイトルメント(ネットワークアクセスのみ)
対話形式のセットアップウィザードを使用して、両方のファイルを生成します:
wails3 setup entitlements
次のファイルが作成されます:
build/darwin/entitlements.dev.plist- 開発ビルド用build/darwin/entitlements.plist- 本番/署名済みビルド用
利用可能なプリセット:\
| プリセット | 説明 |
|---|---|
| 開発 | JIT、未署名メモリ、デバッグ、ネットワーク |
| 本番 | ネットワークのみ(最小限で最も安全) |
| 両方 | 開発用と本番用の両方のファイルを作成(推奨) |
| App Store | ネットワークおよびファイルへのアクセスを許可したサンドボックスを有効化 |
| カスタム | 個別のエンタイトルメントを選択 |
次に、TaskfileのvarsにあるENTITLEMENTSを、適切なファイルを参照するように設定します。
公証
Appleでは、配布するすべてのアプリを公証する必要があります。
**認証情報をキーチェーンに保存します**(初回のみ)。`wails3 setup signing`を実行する(これらの値の入力を求め、内部で`notarytool`を呼び出します)か、`notarytool`を直接呼び出します:
xcrun notarytool store-credentials "my-notarize-profile" \
--apple-id "your@email.com" \
--team-id "ABCD1234" \
--password "app-specific-password"
**TaskfileのKEYCHAIN_PROFILEを設定し**、上記のプロファイル名と一致させます。
**アプリに署名して公証します**:
wails3 task darwin:sign:notarize
**公証を検証します**:
spctl --assess --verbose=2 bin/MyApp.app
Windowsコード署名
前提条件
- コード署名証明書(DigiCert、Sectigoなどから取得)
- Windowsでネイティブ署名を行う場合:Windows SDKがインストール済みであること(
signtool.exe用) - macOS/Linux からクロスプラットフォーム署名を行う場合:
osslsigncode(wails3 setupの署名設定ステップで、ホスト固有のインストールコマンドが表示されます)
自己署名証明書の生成(テスト用)
署名パイプラインをテストするだけであれば、wails3 setup を実行し、署名手順の Windows タブを開いて、自己署名証明書を生成を選択します。これにより、OpenSSL を使用してコード署名用の .pfx が作成され、そのパスがグローバル設定に記録されます。
設定
build/windows/Taskfile.yml を編集し、署名変数を設定します:
vars:
SIGN_CERTIFICATE: "path/to/certificate.pfx"
# Or use thumbprint instead:
# SIGN_THUMBPRINT: "certificate-thumbprint"
# TIMESTAMP_SERVER: "http://timestamp.digicert.com"| 変数 | 必須 | 説明 |
|---|---|---|
SIGN_CERTIFICATE |
上書き指定 | .pfx/.p12 証明書ファイルへのパス(未設定の場合はグローバル設定を使用) |
SIGN_THUMBPRINT |
上書き指定 | Windows 証明書ストア内の証明書の拇印(SIGN_CERTIFICATE の代替) |
TIMESTAMP_SERVER |
いいえ | タイムスタンプサーバーの URL(デフォルト:http://timestamp.digicert.com) |
次に、以下を実行します:
wails3 task windows:sign # Build and sign executable
wails3 task windows:sign:installer # Build and sign NSIS installer
クロスプラットフォーム署名
Windows 実行可能ファイルは、どのプラットフォームからでも署名できます。同じ Taskfile の設定とコマンドを macOS および Linux でも使用できます。
サポートされる Windows 形式
| 形式 | 拡張子 | 備考 |
|---|---|---|
| 実行可能ファイル | .exe | 標準の PE 署名 |
| インストーラー | .msi | Windows Installer パッケージ |
| アプリパッケージ | .msix, .appx | モダン Windows アプリ |
Linux パッケージの署名
Linux パッケージ(DEB および RPM)は、PGP/GPG 鍵を使用して署名します。Windows や macOS のコード署名とは異なり、Linux パッケージ署名はコードが OS によって信頼されていることではなく、パッケージが信頼できる提供元から配布されたことを証明します。
前提条件
- PGP 鍵ペア(Wails で生成可能)
PGP 鍵の生成
最も簡単なのはセットアップウィザードを使用する方法です。wails3 setup を実行し、署名手順の Linux タブを開いて、新しい GPG 鍵を作成を選択します。ウィザードは次の処理を行います:
- GPG キーリングに RSA 4096 鍵を生成します(無人環境や CI で使用しやすい鍵にするには、パスフレーズを空のままにします)。
- 鍵を
~/.wails/signing/<keyid>.ascにエクスポートします(ビルドではこのファイルを使用して署名します)。 - 鍵 ID とエクスポート先のパスの両方を
~/.config/wails/defaults.yamlに記録し、署名時に自動的に使用されるようにします。
gpg を使用して手動で行うこともできます:
# Interactive — the wizard will prompt for name, email, key size and expiry.
gpg --full-generate-key
# Export the key pair to ASCII-armoured files for the Taskfile to consume.
gpg --armor --export-secret-keys "your@email.com" > signing-key.asc
gpg --armor --export "your@email.com" > signing-key.pub.asc
推奨設定:RSA 4096 ビット、有効期限 1 年、強力なパスワードで保護。
設定
build/linux/Taskfile.yml を編集し、署名変数を設定します:
vars:
PGP_KEY: "path/to/signing-key.asc"
# SIGN_ROLE: "builder" # Options: origin, maint, archive, builder| 変数 | 必須 | 説明 |
|---|---|---|
PGP_KEY |
上書き | エクスポートした PGP 秘密鍵ファイルへのパス(未設定の場合は、wails3 setup でグローバルに設定された鍵を使用) |
SIGN_ROLE |
いいえ | DEB 署名ロール(デフォルト:builder) |
次に、以下を実行します。
wails3 task linux:sign:deb # Build and sign DEB package
wails3 task linux:sign:rpm # Build and sign RPM package
wails3 task linux:sign:packages # Build and sign all packages
DEB 署名ロール
DEB パッケージでは、SIGN_ROLE を使用して署名ロールを指定できます。
origin:パッケージの提供元による署名maint:パッケージのメンテナーによる署名archive:アーカイブのメンテナーによる署名builder:パッケージのビルダーによる署名(デフォルト)
クロスプラットフォーム署名
Linux パッケージは、どのプラットフォームからでも署名できます。同じ Taskfile の設定とコマンドを Windows および macOS でも使用できます。
鍵情報の表示
gpg --show-keys signing-key.asc
出力:
pub rsa4096 2024-01-15 [SC] [expires: 2025-01-15]
1234 5678 90AB CDEF 1234 5678 90AB CDEF 1234 5678
uid Your Name <your@email.com>Linux パッケージの検証
# Verify DEB signature
dpkg-sig --verify myapp_1.0.0_amd64.deb
# Verify RPM signature
rpm --checksig myapp-1.0.0.x86_64.rpm
公開鍵の配布
ユーザーがパッケージを検証するには、公開鍵が必要です。
# Export public key for distribution
gpg --armor --export "your@email.com" > myapp-signing.pub.asc
# Users can import it:
# For DEB (apt):
sudo apt-key add myapp-signing.pub.asc
# Or for modern apt:
sudo cp myapp-signing.pub.asc /etc/apt/trusted.gpg.d/
# For RPM:
sudo rpm --import myapp-signing.pub.asc
GitHub Actions との統合
CI 環境では、システムのキーチェーンではなく環境変数を使用してパスワードを渡します。
| 環境変数 | 説明 |
|---|---|
WAILS_WINDOWS_CERT_PASSWORD |
Windows 証明書のパスワード |
WAILS_PGP_PASSWORD |
Linux パッケージ用 PGP 鍵のパスワード |
Taskfile の変数を直接渡すこともできます。
wails3 task darwin:sign SIGN_IDENTITY="$SIGN_IDENTITY" KEYCHAIN_PROFILE="$KEYCHAIN_PROFILE"
macOS ワークフロー
name: Build and Sign macOS
on:
push:
tags: ['v*']
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install Wails
run: go install github.com/wailsapp/wails/v3/cmd/wails3@latest
- name: Import Certificate
env:
CERTIFICATE_BASE64: ${{ secrets.MACOS_CERTIFICATE }}
CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
run: |
echo $CERTIFICATE_BASE64 | base64 --decode > certificate.p12
security create-keychain -p "" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "" build.keychain
security import certificate.p12 -k build.keychain -P "$CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "" build.keychain
- name: Store Notarization Credentials
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
run: |
xcrun notarytool store-credentials "notarize-profile" \
--apple-id "$APPLE_ID" \
--team-id "$APPLE_TEAM_ID" \
--password "$APPLE_APP_PASSWORD"
- name: Build, Sign, and Notarize
env:
SIGN_IDENTITY: ${{ secrets.MACOS_SIGN_IDENTITY }}
run: |
wails3 task darwin:sign:notarize \
SIGN_IDENTITY="$SIGN_IDENTITY" \
KEYCHAIN_PROFILE="notarize-profile"
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: MyApp-macOS
path: bin/*.appWindows ワークフロー
name: Build and Sign Windows
on:
push:
tags: ['v*']
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install Wails
run: go install github.com/wailsapp/wails/v3/cmd/wails3@latest
- name: Import Certificate
env:
CERTIFICATE_BASE64: ${{ secrets.WINDOWS_CERTIFICATE }}
run: |
$certBytes = [Convert]::FromBase64String($env:CERTIFICATE_BASE64)
[IO.File]::WriteAllBytes("certificate.pfx", $certBytes)
- name: Build and Sign
env:
WAILS_WINDOWS_CERT_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
run: |
wails3 task windows:sign SIGN_CERTIFICATE=certificate.pfx
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: MyApp-Windows
path: bin/*.exeクロスプラットフォームワークフロー(Linux ランナー)
単一の Linux ランナーから Windows パッケージと Linux パッケージに署名します。
name: Build and Sign (Cross-Platform)
on:
push:
tags: ['v*']
jobs:
build-and-sign:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Install Wails
run: go install github.com/wailsapp/wails/v3/cmd/wails3@latest
- name: Install Build Dependencies
run: |
sudo apt-get update
sudo apt-get install -y nsis rpm
# Import certificates
- name: Import Certificates
env:
WINDOWS_CERT_BASE64: ${{ secrets.WINDOWS_CERTIFICATE }}
PGP_KEY_BASE64: ${{ secrets.PGP_PRIVATE_KEY }}
run: |
echo "$WINDOWS_CERT_BASE64" | base64 -d > certificate.pfx
echo "$PGP_KEY_BASE64" | base64 -d > signing-key.asc
# Build and sign Windows
- name: Build and Sign Windows
env:
WAILS_WINDOWS_CERT_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
run: |
wails3 task windows:sign SIGN_CERTIFICATE=certificate.pfx
# Build and sign Linux packages
- name: Build and Sign Linux Packages
env:
WAILS_PGP_PASSWORD: ${{ secrets.PGP_PASSWORD }}
run: |
wails3 task linux:sign:packages PGP_KEY=signing-key.asc
# Cleanup secrets
- name: Cleanup
if: always()
run: rm -f certificate.pfx signing-key.asc
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: signed-binaries
path: |
bin/*.exe
bin/*.deb
bin/*.rpmCLI リファレンス
wails3 setup signing
プロジェクトの署名を設定する対話型ウィザードです。
wails3 setup signing [flags]
Flags:
--platform Platform to configure (darwin, windows, linux). Repeatable.
If omitted, auto-detects which platforms to configure from the build directory.
ウィザードでは、以下の設定を順に行います。
- macOS:Developer ID 証明書の選択と、公証用認証情報の設定(
xcrun notarytool store-credentialsを呼び出します)。 - Windows:証明書ファイルまたは拇印の選択と、パスワードおよびタイムスタンプサーバーの設定。
- Linux:既存の PGP 鍵の使用または新しい鍵の生成(
gpgを呼び出します)と、署名ロールの設定。
wails3 setup entitlements
macOS のエンタイトルメントを設定する対話型ウィザードです。
wails3 setup entitlements [flags]
Flags:
--output Output path for entitlements.plist (default: build/darwin/entitlements.plist)
プリセット:
- 開発:JIT、デバッグ、ネットワーク用のエンタイトルメントを含む
entitlements.dev.plistを作成します - 本番:最小限のエンタイトルメントを含む
entitlements.plistを作成します - 両方:両方のファイルを作成します(推奨)
- App Store:Mac App Store 用のサンドボックス化されたエンタイトルメントを作成します
- カスタム:個別のエンタイトルメントと対象ファイルを選択します
wails3 sign
現在のプラットフォームまたは指定したプラットフォーム向けのバイナリとパッケージに署名します。これは、プラットフォームに対応する署名タスクを呼び出すラッパーです。
wails3 sign
wails3 sign GOOS=darwin
wails3 sign GOOS=windows
wails3 sign GOOS=linux
これにより、Taskfile の署名設定を使用する、対応する <platform>:sign タスクが実行されます。
wails3 tool sign
指定したファイルに直接署名するための低レベルコマンドです。Taskfile から内部的に使用されます。
wails3 tool sign [flags]
共通フラグ:\
| フラグ | 説明 |
|---|---|
--input |
署名するファイルのパス |
--output |
出力パス(省略可能。デフォルトでは元のファイルを直接更新) |
--verbose |
詳細出力を有効にする |
Windows/macOS用フラグ:\
| フラグ | 説明 |
|---|---|
--certificate |
PKCS#12(.pfx/.p12)証明書のパス |
--password |
証明書のパスワード |
--timestamp |
タイムスタンプサーバーのURL |
macOS固有のフラグ:\
| フラグ | 説明 |
|---|---|
--identity |
署名ID(アドホック署名には「-」を使用) |
--entitlements |
エンタイトルメントplistのパス |
--hardened-runtime |
Hardened Runtimeを有効にする(デフォルト:true) |
--notarize |
公証のために提出する |
--keychain-profile |
公証用のキーチェーンプロファイル |
Windows固有のフラグ:\
| フラグ | 説明 |
|---|---|
--thumbprint |
Windows証明書ストア内の証明書サムプリント |
Linux固有のフラグ:\
| フラグ | 説明 |
|---|---|
--pgp-key |
PGP秘密鍵のパス |
--pgp-password |
PGP鍵のパスワード |
--role |
DEB署名ロール(origin/maint/archive/builder) |
署名状態の確認(ネイティブツール)
v3 には wails3 signing コマンドはありません。署名状態を確認するには、ネイティブツールを直接使用してください:
| タスク | コマンド |
|---|---|
| macOSのコード署名IDを一覧表示する | security find-identity -v -p codesigning |
| 公証用の認証情報を保存する | xcrun notarytool store-credentials "<profile>" --apple-id … --team-id … --password … |
| PGP鍵ファイルを確認する | gpg --show-keys <key.asc> |
| PGP鍵ペアを生成する | gpg --full-generate-key |
| 公開鍵をエクスポートする | gpg --armor --export <email> |
トラブルシューティング
macOSの問題
「Developer ID証明書が見つかりません」
- 証明書がキーチェーンにインストールされていることを確認してください
security find-identity -v -p codesigningを使用して、証明書の有効期限が切れていないことを確認してください- 「Apple Development」証明書だけでなく、「Developer ID Application」証明書があることを確認してください
「公証に失敗しました」
- 公証ログを確認してください:
xcrun notarytool log <submission-id> --keychain-profile <profile> - Hardened Runtimeが有効になっていることを確認してください
- アプリに未署名のバイナリが含まれていないことを確認してください
「コード署名に失敗しました」
- キーチェーンがロック解除されていることを確認してください:
security unlock-keychain - アプリバンドルのファイル権限を確認してください
Windows の問題
「証明書が見つかりません」
- 証明書のパスが正しいことを確認してください
- 証明書のパスワードを確認してください
- 証明書が有効であること(有効期限切れまたは失効済みでないこと)を確認してください
「タイムスタンプサーバーエラー」
- 別のタイムスタンプサーバーを試してください:
http://timestamp.digicert.comhttp://timestamp.sectigo.comhttp://timestamp.comodoca.com
Linux の問題
「無効な PGP キー」
- キーファイルが ASCII Armor 形式であることを確認してください
gpg --show-keys <key.asc>を使用して、キーの有効期限が切れていないことを確認してください- パスワードが正しいことを確認してください
「署名の検証に失敗しました」
- 公開鍵が正しくインポートされていることを確認してください
- 署名後にパッケージが変更されていないことを確認してください