SignTool を使ってアプリ パッケージに署名する方法

Note

Windowsアプリ パッケージに署名する方法については、「SignTool を使用してアプリ パッケージに署名する」を参照してください。

SignTool を使用して、アプリ パッケージを展開できるようにWindowsアプリ パッケージに署名する方法について説明します。 SignTool は、Windows ソフトウェア開発キット (SDK) の一部です。

すべてのWindows アプリ パッケージは、展開する前にデジタル署名する必要があります。 Microsoft Visual Studio 2012 以降では作成時にアプリ パッケージに署名できますが、Windows SDK からアプリ パッケージ (MakeAppx.exe) ツールを使用して作成したパッケージは署名されません。

Note

SignTool を使用して、Windows 8以降またはWindows Server 2012以降でWindowsアプリ パッケージに署名することしかできません。 SignTool を使用して、Windows 7 や Windows Server 2008 R2 などの下位オペレーティング システムでアプリ パッケージに署名することはできません。

知っておくべきこと

テクノロジ

前提条件

その他の考慮事項

アプリ パッケージの署名に使用する証明書は、次の条件を満たしている必要があります。

  • 証明書のサブジェクト名は、パッケージ内に格納されているAppxManifest.xml ファイルの Identity 要素に含まれるPublisher属性と一致する必要があります。 発行元名はパッケージ化されたWindows アプリの ID の一部であるため、証明書のサブジェクト名をアプリの発行元名と一致させる必要があります。 これにより、署名済みパッケージの ID をデジタル署名に対してチェックできます。 SignTool を使用したアプリ パッケージの署名によって発生する可能性がある署名エラーについては、「アプリ パッケージ署名証明書を作成する方法」の「解説」セクションを参照してください。

  • 証明書は、コード署名に対して有効である必要があります。 これは、これらの項目の両方が true である必要があることを意味します。

    • 証明書の拡張キー使用法 (EKU) フィールドは、設定されていないか、コード署名用の EKU 値 (1.3.6.1.5.5.7.3.3) を含む必要があります。
    • 証明書のキー使用法 (KU) フィールドは、設定されていないか、デジタル署名 (0x80) の使用ビットを含める必要があります。
  • 証明書には秘密キーが含まれています。

  • 証明書は有効です。 アクティブであり、有効期限が切れていないか、取り消されていません。

手順

手順 1: 使用するハッシュ アルゴリズムを決定する

アプリ パッケージに署名するときは、アプリ パッケージの作成時に使用したのと同じハッシュ アルゴリズムを使用する必要があります。 既定の設定を使用してアプリ パッケージを作成した場合、使用されるハッシュ アルゴリズムは SHA256 です。

特定のハッシュ アルゴリズムでアプリ パッケージを使用してアプリ パッケージを作成した場合は、同じアルゴリズムを使用してパッケージに署名します。 パッケージの署名に使用するハッシュ アルゴリズムを決定するには、パッケージの内容を抽出し、AppxBlockMap.xml ファイルを検査します。 BlockMap 要素の HashMethod 属性は、アプリ パッケージの作成時に使用されたハッシュ アルゴリズムを示します。 次に例を示します。

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

上記の BlockMap 要素は、SHA256 アルゴリズムが使用されたことを示します。 次の表に、現在使用可能なアルゴリズムのマッピングを示します。

HashMethod 使用する hashAlgorithm
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx default)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

手順 2: SignTool.exeを実行してパッケージに署名する

.pfx ファイルから署名証明書を使用してパッケージに署名するには

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool が指定されていない場合、/fd hashAlgorithm パラメーターは既定で SHA1 に設定され、SHA1 はアプリ パッケージの署名に対して有効ではありません。 そのため、アプリ パッケージに署名するときは、このパラメーターを指定する必要があります。 既定の SHA256 ハッシュで作成されたアプリ パッケージに署名するには、/fd hashAlgorithm パラメーターを SHA256 として指定します。

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

パスワードで保護されていない .pfx ファイルを使用する場合は、/p password パラメーターを省略できます。 SignTool でサポートされている他の証明書選択オプションを使用して、アプリ パッケージに署名することもできます。 これらのオプションの詳細については、「 SignTool」を参照してください。

Note

署名されたアプリ パッケージで SignTool タイムスタンプ操作を使用することはできません。操作はサポートされていません。

アプリ パッケージにタイム スタンプを設定する場合は、署名操作中に行う必要があります。 次に例を示します。

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

/tr timestampServerUrl パラメーターを RFC 3161 タイム スタンプ サーバーの URL と同じにします。

解説

このセクションでは、アプリ パッケージの署名エラーのトラブルシューティングについて説明します。

アプリ パッケージ署名エラーのトラブルシューティング

SignTool が返すことができる署名エラーに加えて、SignTool はアプリ パッケージの署名に固有のエラーを返すこともできます。 通常、これらのエラーは内部エラーとして表示されます。

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

エラー コードが0x8008で始まる場合 (0x80080206 APPX_E_CORRUPT_CONTENTなど)、署名中のパッケージが無効であることを示します。 この場合、パッケージに署名する前に、パッケージを再構築する必要があります。 0x8008* エラーの完全な一覧については、「 COM エラー コード (セキュリティとセットアップ)」を参照してください。

より一般的には、エラーは0x8007000b (ERROR_BAD_FORMAT) です。 この場合、イベント ログには、より具体的なエラー情報が表示されます。

イベント ログを検索するには

  1. Eventvwr.msc を実行します。
  2. イベント ログを開きます。 イベント ビューアー (ローカル) > アプリケーションとサービス ログ > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
  3. 最新のエラー イベントを探します。

内部エラーは通常、次のいずれかに対応します。

イベント ID イベント文字列の例 提案される解決策
150 エラー 0x8007000B: アプリ マニフェストの発行元の名前 (CN=Contoso) は、署名証明書のサブジェクト名 (CN=Contoso, C=US) と同じにする必要があります。 アプリ マニフェストの発行元の名前は、署名のサブジェクト名と完全に一致する必要があります。
[!注]
これらの名前は引用符で指定され、大文字と小文字と空白の両方が区別されます。

AppxManifest.xml ファイル内の Identity 要素に対して定義されているPublisher属性文字列を、目的の署名証明書のサブジェクト名と一致するように更新できます。 または、アプリ マニフェストの発行元名と一致するサブジェクト名を持つ別の署名証明書を選択します。 マニフェストの発行元名と証明書のサブジェクト名の両方がイベント メッセージに一覧表示されます。
151 エラー 0x8007000B: 指定されている署名ハッシュ方式 (SHA512) は、アプリ バンドルのブロック マップで使用されているハッシュ方式 (SHA256) と同じにする必要があります。 /fd パラメーターで指定された hashAlgorithm が正しくありません (「手順 1: 使用するハッシュ アルゴリズムを決定する」を参照してください)。 アプリ パッケージ ブロック マップに一致する hashAlgorithm を使用して SignTool を 再実行します。
152 エラー 0x8007000B: アプリ パッケージの内容は、そのブロック マップに対して検証する必要があります。 アプリ パッケージは破損しています。再ビルドして、新しいブロック マップを生成する必要があります。 アプリ パッケージの作成の詳細については、「アプリ パッケージ使用したアプリ パッケージの作成」または「Visual Studio 2012 でのアプリ パッケージの作成」を参照してください。

セキュリティの考慮事項

パッケージに署名した後も、パッケージの署名に使用した証明書は、パッケージを展開するコンピューターによって信頼されている必要があります。 ローカル コンピューターの証明書ストアに証明書を追加することによって、コンピューター上のすべてのユーザーの証明書の信頼に影響します。 アプリ パッケージをテストするために必要なコード署名証明書を信頼されたユーザー証明書ストアにインストールし、不要になったら、それらの証明書を迅速に削除することをお勧めします。 アプリ パッケージに署名するための独自のテスト証明書を作成する場合は、テスト証明書に関連付けられている特権を制限することもお勧めします。 アプリ パッケージに署名するためのテスト証明書の作成の詳細については、「アプリ パッケージ署名証明書を作成する方法」を参照してください。

サンプル

アプリ パッケージの作成のサンプル

概念

コード署名のベスト プラクティス

Visual Studio 2012 でパッケージに署名する

SignTool

アプリ パッケージ ツール (MakeAppx.exe)

アプリ パッケージの署名証明書を作成する方法