SignTool

SignTool は、ファイルへのデジタル署名を行い、ファイル内の署名を検証し、ファイルにタイム スタンプを付けるためのコマンドライン ツールです。 ファイルへの署名が重要な理由については、「コード署名の概要」を参照してください。

SignTool は、Windows ソフトウェア開発キット (SDK) の一部として提供されます。 このツールは、Windows SDK のインストール パスの \Bin フォルダーにインストールされます (例: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe)。

Note

Windows SDK、Windows Hardware Lab Kit (HLK)Windows Driver Kit (WDK)、および Windows Assessment and Deployment Kit (ADK) ビルド 20236 以降でビルド & デプロイは、ダイジェスト アルゴリズムを指定する必要があります。 SignTool の sign コマンドを使用するには、署名時およびタイム スタンプ時に、それぞれファイル ダイジェスト アルゴリズム オプション (/fd) およびタイム スタンプ ダイジェスト アルゴリズム オプション (/td) を指定する必要があります。

署名時に /fd が指定されていない場合やタイム スタンプ時に /td が指定されていない場合は、コマンドから警告 (エラー コード 0、初期) がスローされます。 SignTool の新しいバージョンでは、警告がエラーになります。 SHA256 をお勧めします。 業界では SHA1 よりも安全であると考えられています。

構文

signtool [command] [options] [file_name | ...]

パラメーター

Argument 説明
command ファイルに対して実行する操作を指定する 4 つのコマンド (catdbsigntimestampverify) のいずれか。 各コマンドの詳細については、次の表を参照してください。
options コマンドを変更するオプションです。 グローバル オプション /q および /v のほかに、各コマンドは固有のオプション セットをサポートします。
file_name 署名対象のファイルのパス。

SignTool では、以下のコマンドがサポートされています。

command 説明
catdb カタログ ファイルをカタログ データベースに追加したり、カタログ データベースから削除したりします。 カタログ データベースは、カタログ ファイルの自動検索で使用され、GUID によって識別されます。 catdb コマンドでサポートされているオプションの一覧については、「catdb コマンドのオプション」を参照してください。
sign ファイルにデジタル署名します。 デジタル署名を使用すると、ファイルの改ざんを防止し、ユーザーが署名証明書に基づいて署名者を検証できるようになります。 sign コマンドでサポートされているオプションの一覧については、「sign コマンドのオプション」を参照してください。
timestamp ファイルにタイム スタンプを付けます。 timestamp コマンドでサポートされているオプションの一覧については、「TimeStamp コマンドのオプション」を参照してください。
verify ファイルのデジタル署名を検証します。 署名証明書が信頼できる機関から発行されたかどうか、署名証明書が失効していないかどうかを確認します。また、オプションで、署名証明書が特定のポリシーに対して有効かどうかを確認します。 verify コマンドでサポートされているオプションの一覧については、「Verify コマンドのオプション」を参照してください。

次のオプションは、すべての SignTool コマンドで使用できます。

Global オプション 説明
/q コマンドが正常に実行した場合には何も出力されず、コマンドが失敗した場合には最小限の出力が表示されます。
/v コマンドが正常に実行したか、失敗したかにかかわらず、詳細出力と警告メッセージが表示されます。
/debug デバッグ情報を表示します。

catdb コマンドのオプション

次の表に、catdb コマンドで使用できるオプションを示します。

Catdb オプション 説明
/d 既定のカタログ データベースを更新するように指定します。 /d/g のいずれも指定しなかった場合は、SignTool によりシステム コンポーネントとドライバー データベースが更新されます。
/g GUID GUID で識別されるカタログ データベースを更新します。
/r 指定したカタログをカタログ データベースから削除します。 このオプションが指定されていない場合、SignTool は指定されたカタログをカタログ データベースに追加します。
/u 追加されたカタログ ファイルに対して、一意な名前を自動的に生成するように指定します。 必要に応じて、既存のカタログ ファイルと名前が競合しないように、カタログ ファイルの名前が変更されます。 このオプションが指定されていない場合、SignTool は指定されたカタログと同じ名前を持つ既存のカタログを上書きします。

Note

カタログ データベースは、カタログ ファイルの自動検索に使用されます。

Sign コマンド オプション

次の表に、sign コマンドで使用できるオプションを示します。

Sign コマンド オプション 説明
/a 最適な署名証明書を自動的に選択します。 SignTool は、指定されたすべての条件を満たす有効な証明書をすべて検出し、最も長い期間有効である証明書を選択します。 このオプションが指定されていない場合、SignTool で検出される有効な署名証明書は 1 つだけであることが前提になります。
/ac file 署名ブロックに証明書を file から追加します。
/as この署名を追加します。 プライマリ署名が存在しない場合は、この署名がプライマリ署名になります。
/c CertTemplateName 署名証明書に対して証明書テンプレート名 (Microsoft 拡張機能) を指定します。
/csp CSPName 秘密キー コンテナーを含む暗号化サービス プロバイダー (CSP: Cryptographic Service Provider) を指定します。
/d Desc 署名された内容の説明を指定します。
/dg パス 署名対象のダイジェストと署名されていない PKCS7 ファイルを生成します。 出力されるダイジェストおよび PKCS7 ファイルは、<Path>\<FileName>.dig および <Path>\<FileName>.p7u です。 追加の XML ファイルを出力するには、/dxml を使用します。
/di パス 署名されていない PKCS7 ファイルに署名済みダイジェストを取り込んで、署名を作成します。 入力する署名済みダイジェストファイルと署名されていない PKCS7 ファイルは、<Path>\<FileName>.dig.signed および <Path>\<FileName>.p7u の形式で指定します。
/dlib DLL ダイジェストに署名するための AuthenticodeDigestSign 関数を実装している DLL を指定します。 このオプションを指定すると、個別に /dg/ds、および /di オプションを使用して SignTool を使用した場合と同じ結果になります。 このオプションを指定した場合は、これら 3 つのすべてが 1 つのアトミック操作として呼び出されます。
/dmdf Filename /dg オプションと共に使用した場合は、ファイルのコンテンツがそのまま AuthenticodeDigestSign 関数に渡されます。
/ds ダイジェストにのみ署名します。 入力ファイルには、/dg オプションによって生成されるダイジェストを指定します。 出力ファイルは <File>.signed の形式になります。
/du URL 署名された内容の詳細な説明に対する URL (Uniform Resource Locator) を指定します。
/dxml /dg オプションと共に使用すると、XML ファイルが生成されます。 出力ファイルは、<Path>\<FileName>.dig.xml の形式になります。
/f SignCertFile ファイルの署名証明書を指定します。 ファイルが個人情報交換 (PFX: Personal Information Exchange) 形式でパスワードによって保護されている場合に、/p オプションを使用してパスワードを指定します。 ファイルに秘密キーが含まれていない場合は、/csp オプションおよび /kc オプションを使用して、CSP と秘密キー コンテナー名を指定します。
/fd alg ファイルの署名の作成に使用するファイル ダイジェスト アルゴリズムを指定します。 メモ: 署名時に /fd オプションが指定されていない場合は、コマンドによってエラーが生成されます。
/fd certHash 文字列 "certHash" を指定すると、署名証明書で指定されているアルゴリズムがコマンドで使用されます。 メモ: 署名時に /fd オプションが指定されていない場合は、コマンドによってエラーが生成されます。
/i IssuerName 署名証明書の発行者の名前を指定します。 この値には、発行者名全体の部分文字列を指定できます。
/kc PrivKeyContainerName 秘密キー コンテナー名を指定します。
/n SubjectName 署名証明書の件名を指定します。 この値には、件名全体の部分文字列を指定できます。
/nph サポートされている場合に、実行可能ファイルのページ ハッシュを抑制します。 既定値は、SIGNTOOL_PAGE_HASHES 環境変数と wintrust.dll のバージョンによって決定されます。 PE ファイル以外では、このオプションは無視されます。
/p Password PFX ファイルを開くときに使用するパスワードを指定します。 PFX ファイルを指定するには、/f オプションを使用します。
/p7 パス 指定する各コンテンツ ファイルについて公開キー暗号化規格 (PKCS) #7 ファイルを作成することを指定します。 PKCS #7 ファイルは、<path>\<filename>.p7 という名前になります。
/p7ce Value 署名された PKCS#7 コンテンツのオプションを指定します。 署名されたコンテンツを PKCS #7 ファイルに埋め込む場合は ValueEmbedded に設定し、デタッチされた PKCS #7 ファイルの署名済みデータ部分を作成する場合には DetachedSignedData に設定します。 /p7ce オプションを指定しなかった場合は、既定で署名済みコンテンツが埋め込まれます。
/p7co <OID> 署名された PKCS#7 コンテンツを識別するオブジェクト識別子 (OID) を指定します。
/ph サポートされている場合に、実行可能ファイルのページ ハッシュを生成します。
/r RootSubjectName 署名証明書のチェーン先とするルート証明書の件名を指定します。 この値には、ルート証明書の件名全体の部分文字列を指定できます。
/s StoreName コマンドが証明書を検索するときに開くストアを指定します。 このオプションを指定しなかった場合、コマンドは My ストアを開きます。
/sha1 Hash 署名証明書の SHA1 ハッシュを指定します。 他のオプションで指定された条件を満たす証明書が複数ある場合は、一般的に SHA1 ハッシュが使用されます。
/sm コマンドがユーザー ストアではなくコンピューター ストアを使用することを指定します。
/t URL タイム スタンプ サーバーの URL を指定します。 このオプションまたは /tr が指定されていない場合は、署名されたファイルにタイム スタンプが付きません。 タイム スタンプ付けの処理に失敗すると、コマンドによって警告が生成されます。 このオプションを /tr オプションと一緒に使用することはできません。
/td alg /tr オプションと共に使用して、RFC 3161 タイム スタンプ サーバーで使用されるダイジェスト アルゴリズムを要求します。 メモ: タイム スタンプ付けの処理時に /td が指定されていない場合は、コマンドによってエラーが生成されます。
/tr URL RFC 3161 タイム スタンプ サーバーの URL を指定します。 このオプションまたは /t が指定されていない場合は、署名されたファイルにタイム スタンプが付きません。 タイム スタンプ付けの処理に失敗すると、コマンドによって警告が生成されます。 このオプションを /t オプションと一緒に使用することはできません。
/u Usage 署名証明書に必要な拡張キー使用法 (EKU: Enhanced Key Usage) を指定します。 使用法の値は、OID または文字列によって指定できます。 Usage の既定値は、Code Signing (1.3.6.1.5.5.7.3.3) です。
/uw 使用法として Windows System Component Verification (1.3.6.1.4.1.311.10.3.6) を指定します。

使用例については、「Using SignTool to Sign a File」(SignTool を使用してファイルに署名する) を参照してください。

timestamp コマンドのオプション

次の表に、timestamp コマンドで使用できるオプションを示します。

timestamp オプション 説明
/p7 PKCS #7 ファイルにタイム スタンプを付けます。
/t URL タイム スタンプ サーバーの URL を指定します。 タイム スタンプを付けるファイルは、事前に署名されている必要があります。 /t オプションまたは /tr オプションを指定する必要があります。
/td alg /tr オプションと共に使用して、RFC 3161 タイム スタンプ サーバーで使用されるダイジェスト アルゴリズムを要求します。 メモ: タイム スタンプ付けの処理時に /td が指定されていない場合は、コマンドによって警告が生成されます。
/tp index index で署名にタイム スタンプを付けます。
/tr URL RFC 3161 タイム スタンプ サーバーの URL を指定します。 タイム スタンプを付けるファイルは、事前に署名されている必要があります。 /tr オプションまたは /t オプションを指定する必要があります。

verify コマンドのオプション

次の表に、verify コマンドで使用できるオプションを示します。

Verify オプション 説明
/a ファイルの検証にすべてのメソッドを使用できることを指定します。 まず、SignTool はカタログ データベースを検索して、カタログでファイルが署名されているかどうかを確認します。 どのカタログでもファイルが署名されていない場合、SignTool はファイルの埋め込み署名の検証を試みます。 カタログ内で署名されているかどうかわからないファイルを検証する場合は、このオプションの使用をお勧めします。 署名されているかどうかわからないファイルとしては、Windows ファイルやドライバーなどがあります。
/ad 既定のカタログ データベースを使用してカタログを検索します。
/all 複数の署名を含むファイル内の、すべての署名を検証します。
/as システム コンポーネント (ドライバー) のカタログ データベースを使用してカタログを検索します。
/ag CatDBGUID GUID によって識別されるカタログ データベース内でカタログを検索します。
/c CatFile 名前でカタログ ファイルを指定します。
/d 説明と、説明の URL を出力します。 Windows Vista 以前の場合: このオプションはサポートされていません。
/ds Index 特定の位置で署名を検証します。
/hash{SHA1|SHA256} カタログ内のファイルを検索する場合に使用するオプションのハッシュ アルゴリズムを指定します。
/kp x64 カーネル モード ドライバー署名ポリシーを使用して検証を実行します。
/ms 複数の検証セマンティクスを使用します。 この動作は、WinVerifyTrust 呼び出しでの既定動作です。
/o Version オペレーティング システムのバージョンでファイルを確認します。 Version パラメーターは、 <PlatformID>:<VerMajor>.<VerMinor>.<BuildNumber> の形式で指定します。 この /o オプションの使用をお勧めします。 /o を指定しなかった場合は、予期しない結果が SignTool から返されることがあります。 たとえば、/o を含めなかった場合、古いオペレーティング システム上で正しく検証されるシステム カタログが、新しいオペレーティング システムでは正しく検証されないことがあります。
/p7 PKCS #7 ファイルを確認します。 PKCS #7 検証で既存のポリシーは使用されません。 SignTool は署名をチェックし、署名証明書のチェーンを構築します。
/pa 既定の認証検証ポリシーの使用を指定します。 /pa オプションが指定されていない場合、SignTool は Windows ドライバー検証ポリシーを使用します。 このオプションを catdb オプションと一緒に使用することはできません。
/pg PolicyGUID GUID により検証ポリシーを指定します。 GUID は検証ポリシーの ActionID に対応しています。 このオプションを catdb オプションと一緒に使用することはできません。
/ph ページ ハッシュ値を出力して検証します。 Windows Vista 以前の場合: このオプションはサポートされていません。
/r RootSubjectName 署名証明書のチェーン先とするルート証明書の件名を指定します。 この値には、ルート証明書の件名全体の部分文字列を指定できます。
/tw 署名にタイム スタンプが付いていない場合にコマンドからの警告を生成するように指定します。

SignTool の verify コマンドは、署名証明書が信頼できる機関から発行されたかどうか、署名証明書が失効していないかどうかを確認します。また、オプションで、署名証明書が特定のポリシーに対して有効かどうかを確認します。

SignTool の verify コマンドは、/a/ad/as/ag/cなど、カタログを検索するためのオプションが指定されていない限り、埋め込み署名の状態を出力します。

戻り値

SignTool は、終了時に次のいずれかの終了コードを返します。

終了コード 説明
0 実行に成功しました。
1 実行に失敗しました。
2 実行は完了しましたが、警告があります。

使用例

カタログ ファイル MyCatalogFileName.cat をシステム コンポーネントおよびドライバー データベースに追加するコマンドを次に示します。 /u オプションは、MyCatalogFileName.cat という名前の既存のカタログ ファイルが置き換えられないように、必要に応じて一意の名前を生成します。

signtool catdb /v /u MyCatalogFileName.cat

最適な証明書を使用してファイルに自動的に署名するコマンドを次に示します。

signtool sign /a /fd SHA256 MyFile.exe 

パスワードで保護された PFX ファイルに格納されている証明書を使用してファイルにデジタル署名するコマンドを次に示します。

signtool sign /f MyCert.pfx /p MyPassword /fd SHA256 MyFile.exe 

ファイルにデジタル署名を行いタイム スタンプを付けるコマンドを次に示します。 ファイルへの署名に使用する証明書は、PFX ファイルに格納されています。

signtool sign /f MyCert.pfx /t http://timestamp.digicert.com /fd SHA256 MyFile.exe 

My ストアにある件名が My Company Certificate の証明書を使用してファイルに署名するコマンドを次に示します。

signtool sign /n "My Company Certificate" /fd SHA256 MyFile.exe 

ActiveX コントロールに署名し、ユーザーにコントロールのインストールを求めるメッセージを表示する際にブラウザーに表示する情報を提供するコマンドを次に示します。

signtool sign /f MyCert.pfx /d: "MyControl" /du http://www.example.com/MyControl/info.html /fd SHA256 MyControl.exe 

デジタル署名済みのファイルにタイム スタンプを付けるコマンドを次に示します。

signtool timestamp /t http://timestamp.digicert.com MyFile.exe

RFC 3161 タイム スタンプ サーバーを使用してファイルにタイム スタンプを付けるコマンドを次に示します。

signtool timestamp /tr http://timestamp.digicert.com /td SHA256 MyFile.exe

ファイルが署名済みであることを検証するコマンドを次に示します。

signtool verify MyFile.exe

カタログ内で署名済みの可能性があるシステム ファイルを検証するコマンドを次に示します。

signtool verify /a SystemFile.dll

MyCatalog.cat という名前のカタログ内で署名済みのシステム ファイルを検証するコマンドを次に示します。

signtool verify /c MyCatalog.cat SystemFile.dll

関連項目

SignTool を使用してファイルに署名する

コード署名の概要