winapp CLI を使用すると、ローカルWindows開発が簡単になります。署名証明書を生成し、マシンで信頼し、開発者モードを有効にすることができます。 これらの各手順は、マシンの状態を変更するか、秘密キーを持つファイルを作成するため、実行内容を正確に把握するのに役立ちます。
このページでは、各コマンドの結果、元に戻す方法、発送時の操作の違いについて説明します。 開発証明書と開発者モードは、ローカル テストでサポートされる通常のパスです。ここでの目標は、オプトインしているものを理解することであり、回避するわけではありません。
開発証明書
MSIX パッケージは、Windowsインストールする前に署名する必要があります。 ローカル テストでは、 winapp cert generate は自己署名証明書を作成して、何も購入せずに独自のパッケージに署名してインストールできるようにします。
winapp cert generateによって作成される内容
生成された証明書は、自己署名のエンド エンティティ コード署名証明書です。
| 財産 | 価値 |
|---|---|
| Key | RSA 2048 ビット、エクスポート可能とマーク |
| 署名アルゴリズム | SHA-256 と RSA (PKCS#1 v1.5) |
| 主な使用法 | デジタル署名 |
| 拡張キー使用法 | コード署名 (1.3.6.1.5.5.7.3.3) |
| 基本的な制約 | 証明機関ではない |
| 有効性 | 既定では 365 日 (--valid-days) |
| Subject | マニフェスト内の Publisher と一致する必要があります |
このコマンドは、次の 2 つを書き込みます。
-
devcert.pfx現在のディレクトリ (または--outputに渡すパス)。 このファイルには、証明書とその秘密キーの 両方 が含まれています。 - 個人証明書ストア (
Cert:\CurrentUser\My) 内の証明書のコピー。
--export-cerでは、.pfxの横に.cer ファイルも書き込まれます。 このファイルには公開証明書のみが含まれています。秘密キーはありません。これにより、ビルドを信頼する必要があるチームメイトまたはテスト マシンに渡すのに適しています。
Note
自己署名証明書は、誰かが明示的に信頼するまで、誰も信頼しません。 それはあなた自身の機械およびあなた自身のテスト機械のために良い;これは、アプリを配布するときに実際のコード署名 ID に代わるものではありません。
既定のパスワード
password を渡さない限り、winapp cert generate は PFX パスワードとして --password を使用します。 後でその証明書を --password に指定するときも、そのパスワード オプションは winapp sign であり、winapp pack を取る --cert-password に対しても、同じ既定値が適用されます。
よく知られているパスワードは、 devcert.pfx の秘密キーが実質的に保護されていないことを意味します。ファイルを取得したユーザーは、そのパスワードでコードに署名できます。 これは、ローカル テスト ビルドに自分のコンピューター上でのみ署名する、使い捨て証明書に対して許容できるトレードオフであり、既定が存在する理由です。
Important
既定のパスワードは、証明書が破棄可能であることを示すシグナルとして扱います。 他のユーザーがインストールする何かに署名するために証明書を使用した場合は、既定のパスワードを持つ winapp cert generate 証明書にすることはできません。実 稼働用の署名を参照してください。
スクリプトとエージェントは、パスワード自体を比較する必要はありません。 winapp cert generate --json レポート "defaultPasswordIsPublic": true し、既定値が有効な場合は常に warnings 配列で開示を繰り返します。
証明書の JSON 出力の生成を参照してください。
証明書ファイルが存在する場所
devcert.pfx はディスク上の秘密キーです。 次の 2 つのルールで問題を防げます。
コミットしないでください。winapp cert generate は、証明書のファイル名をその横の .gitignore に自動的に追加するため、既定のフローは既にカバーされています。 ファイルを移動するか、名前を変更するか、別の .gitignoreによって管理されているディレクトリに生成する場合は、エントリがそれに従っていることを確認します。
git check-ignore -v devcert.pfx
何も出力されない場合、そのファイルは無視されていないので、コミットする前に追加してください。
パッケージ化しないでください。winapp pack は入力ディレクトリ内のすべてをパッケージ化するため、アプリの出力フォルダーに格納されている devcert.pfx は、出荷された MSIX 内に格納されます。 パッケージ化の EXE/CLI ガイド に示されているように、パッケージ化するフォルダーの外側に証明書を生成し、配布する前に存在しないことを確認します。
# Unpack the package and check that no certificate is inside
winapp tool makeappx unpack /p .\MyApp.msix /d .\inspect /o
Get-ChildItem .\inspect -Recurse -Include *.pfx, *.cer
Tip
実際の秘密キーを持つ .pfx がコミットまたは発行された場合は、ローテーションします。新しい証明書を生成し、再署名し、「 信頼された証明書を削除する」の手順を使用して古い証明書の信頼を停止します。 後のコミットからファイルを削除しても、履歴から削除されることはありません。
winapp cert install によって付与されるもの
winapp cert install は、証明書を LocalMachine\TrustedPeople ストアに追加します。 コンピューター上のすべてのユーザーの信頼が変更されるため、これには管理者特権が必要です。
証明書がTrustedPeopleされると、Windowsは、テストしていたパッケージだけでなく、その証明書によって署名された MSIX パッケージをインストールするのに十分な信頼済みとして受け入れます。 秘密キーをローカルに保持して保持する証明書の場合、これが意図した効果です。 また、それについて意図的に検討する理由でもあります。
- 自分で生成した証明書、またはコンピューターにソフトウェアをインストールできるユーザーからの証明書を信頼します。
- 他のユーザーが依存している共有、運用、またはビルド マシンに開発証明書をインストールしないでください。
- 同僚がテスト パッケージをインストールする必要がある場合は、
.pfxではなく、.cer(公開キーのみ) を配布することをお選びください。 ユーザーは、自分と同じように署名する機能を得ることなく、ビルドを信頼する能力を得ることができます。
別のテスト コンピューターで .cer を信頼するには、 winapp cert install を直接実行します。コマンドは、 .pfx またはパブリック専用の .cerを受け入れます。
# Run as Administrator
winapp cert install .\devcert.cer
組み込みのWindows ツールのみを使用する同等のツールは次のとおりです。
# Run as Administrator
Import-Certificate -FilePath .\devcert.cer -CertStoreLocation Cert:\LocalMachine\TrustedPeople
信頼された証明書の削除
開発証明書は既定で 1 年後に期限切れになりますが、有効期限は削除されません。 証明書の使用が完了したら(プロジェクトが終了し、マシンが再利用されているか、キーが漏洩した可能性があります)、明示的に削除します。
まず、拇印を見つけます。
Get-ChildItem Cert:\LocalMachine\TrustedPeople |
Where-Object { $_.Subject -like '*CN=Contoso*' } |
Format-List Subject, Thumbprint, NotAfter
次に、マシン信頼ストアから削除します。 この手順には昇格が必要です。
# Run as Administrator. Replace with the thumbprint from the previous command.
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\LocalMachine\TrustedPeople\$thumbprint"
cert generate また、証明書とその秘密キーを個人用ストアに配置しました。
cert generate を実行したアカウントでサインインしている、通常の (特権のない) プロンプトからそれを削除してください:
$thumbprint = 'ABCD...'
Remove-Item -Path "Cert:\CurrentUser\My\$thumbprint"
Important
上記の 2 つのコマンドを、示されているコンテキストで実行します。 別の管理者アカウントを使用して昇格した場合、その管理者特権セッションの Cert:\CurrentUser は、管理者のストア (自分のストアではなく) であるため、秘密キーは生成ユーザーのストアに残されます。
最後に、配布した .pfx と .cer コピーを削除し、サイドロードしたパッケージの登録を解除します。
winapp unregister
Note
証明書を削除しても、既にインストールされているパッケージはアンインストールされません。
[設定] > [アプリ] >インストール済みアプリ、または開発モードで登録されているパッケージのwinapp unregisterを使用して個別にアンインストールします。
開発者モード
Windowsでは、ビルドされた署名付き MSIX をインストールする代わりに、開発者モードでディスク上のフォルダー (緩いレイアウト) から直接アプリ パッケージを登録する必要があります。
winapp run や create-debug-identity などのコマンドはそれに依存しており、それがないと失敗します。また、winapp init ではそれを有効にすることもできます。
有効にすると何が変わるか
CLI は、HKEY_LOCAL_MACHINEの下に 2 つのDWORD値を書き込むことで開発者モードを有効にします。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense = 1
AllowAllTrustedApps = 1
これらはコンピューター全体の設定であるため、CLI は昇格されたヘルパー プロセスを起動し、ユーザー アカウント制御プロンプトWindows表示されます。 プロンプトを拒否しても何も変更されません。
実際には、これは機械が次のように動作することを意味します。
- アプリ パッケージを MSIX に組み込んだり、まったく署名したりせずに、ディスク上のフォルダーから直接登録します (
AllowDevelopmentWithoutDevLicense)。 -
TrustedPeople(AllowAllTrustedApps) 内の開発証明書を含め、コンピューターが信頼する証明書によって署名されている限り、Microsoft Storeの外部からアプリ パッケージをインストールします。
Important
開発者モードと信頼できる開発証明書は、既定のインストール制限を意図的に緩和することです。 この組み合わせは、開発マシンとテスト マシンに属します。 本番環境のマシン、キオスク、共有インフラストラクチャでは、オフのままにしておいてください。
有効なタイミングを制御する
winapp init は何かを変更する前に質問し、 --use-defaults は質問を完全にスキップし、開発者モードはそのままにします。 これにより、スクリプトと CI が既定で安全に実行されます。
winapp init --use-defaults
設定を自分で管理する場合は、[ Settings > System > For developers > Developer Mode を使用して設定を 1 回有効にすると、CLI によって検出されて次に進みます。
オフにする
開発者向けシステム >>設定を使用し、開発者モードをオフにします。 これは推奨パスです。これは、関連付けられている OS の状態も設定によってクリーンアップされるためです。 後でレジストリ値を確認するには:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock' `
-Name AllowDevelopmentWithoutDevLicense, AllowAllTrustedApps
開発者モードをオフにしても、信頼できる証明書や既にインストールされているパッケージは削除されません。 信頼できる証明書の削除を参照してください。
運用環境の署名
開発証明書は、明示的に信頼しているユーザーに対してのみ機能します。 アプリを配布するには、既に信頼Windows ID で署名します。
署名 ID を選択する
Azure の信頼された署名 — クラウド管理の署名サービス。 秘密キーがビルドマシン上に存在することは決してないため、手作業で保護したり、漏えいを心配したり、ローテーションしたりする必要のある
.pfxはありません。winapp az-signを使用します。これは標準の Azure 資格情報チェーンで認証し、GitHub Actions OIDC またはマネージド ID で動作します。winapp az-sign .\MyApp.msix信頼された証明機関からのコード署名証明書 — パスワードを
--passwordに指定して、2 番目の位置指定引数としてwinapp signに渡します。 その後、キーマテリアルを安全に保管する責任があります。ハードウェア トークン、キー コンテナー、または CI プロバイダーのシークレット ストアに保持し、リポジトリ内に保持しないでください。Microsoft Store — ストアを通じて排他的に配布する場合は、パッケージに署名し、提出前に署名する必要はありません。
どの場合も、証明書のサブジェクトは、スパース パッケージを含め、マニフェストのPublisher値と一致する必要があります。
署名シークレットをリポジトリに含めない
証明書パスワードは、構成ファイルではなく、CI シークレット ストアに属しています。 ハードコーディングするのではなく、環境から読み取ります。
winapp sign .\MyApp.msix $env:SIGNING_CERT_PATH --password $env:SIGNING_CERT_PASSWORD
Electron Forge 構成など、ソース管理にチェックインされたビルド構成にも同じことが当てはまります。 Electron packaging を参照してください。
winapp az-sign は、渡すパスワードがないため、問題を完全に回避します。
発行する前に
ローカル テストから配布への移行に関する簡単なチェックリスト:
- パッケージは、CA が発行した証明書、Azure の信頼された署名、またはストアに送信され、
devcert.pfxではなく署名されます。 - パッケージ化された出力内に
.pfxまたは.cerファイルがありません。 - コミットされたファイル、ビルド スクリプト、または CI ログに証明書パスワードは表示されません。
- 証明書のサブジェクトは、マニフェストの
Publisherと一致します。 - 開発証明書と開発者モードは、アプリを 実行 するだけで済むマシンでは有効になりません。
セキュリティの問題の報告
winapp CLI 自体のセキュリティの脆弱性を報告するには、 SECURITY.md のプロセスに従います。 セキュリティに関する報告については、GitHub の公開 issue を作成しないでください。
関連トピック
Windows developer