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 などの下位のオペレーティング システムでアプリ パッケージに署名することはできません。
知っておくべきこと
テクノロジ
前提条件
Windows SDK の一部である SignTool
有効なコード署名証明書 (たとえば、MakeCert.exe および Pvk2Pfx.exe ツールで作成された Personal Information Exchange (.pfx) ファイル)
有効なコード署名証明書の作成についての詳細は、「 アプリ パッケージ署名証明書を作成する方法」を参照してください。
パッケージ化された Windows アプリ (たとえば、アプリ パッケージャー (MakeAppx.exe) ツールを使用して作成された .appx ファイル)
その他の考慮事項
アプリ パッケージの署名に使用する証明書は、次の条件を満たしている必要があります。
証明書のサブジェクト名は、パッケージ内に格納されている AppxManifest.xml ファイルの ID 要素に含まれている 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) |
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 パスワード パラメーターを省略できます。 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) です。 この場合、イベント ログには、より具体的なエラー情報が表示されます。
エベント ログを検索するには
- Eventvwr.msc を実行します。
- イベント ログを開きます。[イベント ビューアー (ローカル)] > [アプリケーションとサービス ログ] > [Microsoft] > [Windows] > [AppxPackagingOM] > [Microsoft-Windows-AppxPackaging/Operational] の順に展開します。
- 最新のエラー イベントを探します。
内部エラーは、通常、次のいずれかに対応します。
イベント ID | イベント文字列の例 | サジェスチョン |
---|---|---|
150 | エラー 0x8007000B: アプリ マニフェストの発行元名 (CN=Contoso) は、証明書署名のサブジェクト名 (CN=Contoso、C=US) と一致する必要があります。 | アプリ マニフェストの発行元名は、署名のサブジェクト名と正確に一致する必要があります。 注: これらの名前は引用符で囲んで指定され、大文字と小文字と空白の両方が区別されます。 AppxManifest.xml ファイル内の ID 要素に対して定義されているPublisher 属性文字列を、目的の署名証明書のサブジェクト名と一致するように更新できます。 または、アプリ マニフェストの発行元名と一致するサブジェクト名を持つ別の署名証明書を選択します。 マニフェストの発行元名と証明書のサブジェクト名の両方がイベント メッセージに一覧表示されます。 |
151 | エラー 0x8007000B: 指定された署名ハッシュ メソッド (SHA512) は、アプリ パッケージ ブロック マップ (SHA256) で使用されるハッシュ メソッドと一致する必要があります。 | /fd パラメーターで指定された hashAlgorithm が正しくありません (「手順 1: 使用するハッシュ アルゴリズムを決定する」を参照してください)。 アプリ パッケージ のブロック マップに一致する hashAlgorithm を使用して SignTool を再実行します。 |
152 | エラー 0x8007000B: アプリ パッケージの内容は、そのブロック マップに対して検証する必要があります。 | アプリ パッケージが破損しているため、新しいブロック マップを生成するには再構築する必要があります。 アプリ パッケージの作成の詳細については、「アプリ パッケージャーを使用したアプリ パッケージの作成」または「Visual Studio 2012 でのアプリ パッケージの作成」を参照してください。 |
セキュリティに関する考慮事項
パッケージに署名した後も、パッケージの署名に使用した証明書は、パッケージをデプロイするコンピューターに信頼されている必要があります。 ローカル コンピューター証明書ストアに証明書を追加すると、コンピューター上のすべてのユーザーにおける証明書の信頼に影響します。 アプリ パッケージのテスト用に必要なコード署名証明書を Trusted People 証明書ストアにインストールし、不要になったらすぐにそれらの証明書を削除することをお勧めします。 アプリ パッケージに署名するための独自のテスト証明書を作成する場合は、テスト証明書に関連付けられている特権を制限することもお勧めします。 アプリ パッケージに署名するためのテスト証明書の作成の詳細については、「アプリ パッケージ署名証明書を作成する方法」を参照してください。