signtool sign コマンドリファレンス
このドキュメントにおける signtool はsslTrusリモートコード署名クライアントCLIを指し、Microsoft Windows SDKに付属の signtool.exe ではありません。Windows SDKツールを使用する場合は、Microsoft signtool.exe と明記します。
signtool sign はローカルファイルに対して直接リモート署名を実行します。CLIはローカルで署名対象データを抽出し、リモートサービスを呼び出して秘密鍵による署名を完了させた後、署名、タイムスタンプ、証明書情報を出力ファイルに書き戻します。
signtool sign [flags]
ヘルプとバージョンを表示:
signtool --help
signtool --version
認証情報の設定
sign コマンドは以下の方法でアクセス認証情報を読み取ります:
| 認証情報項目 | パラメータ | 環境変数 | 説明 |
|---|---|---|---|
| Access Key | --access-key / -k | ACCESS_KEY | パラメータが空の場合、環境変数を自動的に読み取ります |
| Access Secret | --access-secret / -s | ACCESS_SECRET | パラメータが空の場合、環境変数を自動的に読み取ります |
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"
リモートサービスアドレスは --address パラメータで制御され、以下の値をサポートしています:
| パラメータ値 | 実際のサービスアドレス |
|---|---|
nicsrs | https://ssl.face.nicsrs.com |
空値、racent またはその他の任意の値 | https://ssl.face.racent.com |
ACCESS_KEYとACCESS_SECRETが実際に読み取られる環境変数名です。SIGNTOOL_ACCESS_KEY/SIGNTOOL_ACCESS_SECRETは現在のCLIによって自動的に読み取られることはありません。- Access Secretをシェル履歴やスクリプトリポジトリに書き込むことは推奨されません。実行時に注入される環境変数または安全なCI変数を優先的に使用してください。
パラメータの説明
| パラメータ | 省略形 | デフォルト値 | 説明 |
|---|---|---|---|
--address | -a | 空 | リモートサービスアドレスの識別子であり、URLパススルーパラメータではありません。 |
--access-key | -k | 空 | 空の場合は ACCESS_KEY を読み取ります。 |
--access-secret | -s | 空 | 空の場合は ACCESS_SECRET を読み取ります。 |
--cert-code | -c | 空 | 必須。証明書番号です。 |
--file | -f | 空 | 必須。署名対象ファイルのパス。ディレクトリは指定できません。 |
--out | -o | 空 | 出力ファイルのパス。空欄で上書きが有効になっていない場合、デフォルトのファイル名が自動生成されます。 |
--override | — | false | 出力ファイルで元のファイルを上書きします。 |
--sha1 | -1 | false | SHA1署名を有効にします。 |
--sha2 | -2 | true | SHA2署名を有効にします。 |
--timestamp | — | auto | SHA1 Authenticode タイムスタンプアドレス。auto はデフォルトアドレスを使用し、空文字列の場合は無効になります。 |
--timestamp-rfc3161 | — | auto | SHA2 RFC3161 タイムスタンプアドレス。auto はデフォルトアドレスを使用し、空文字列の場合は無効になります。 |
--desc | -n | 空 | 署名に書き込むプログラムの説明テキスト。 |
--url | -u | 空 | 署名を書き込むプログラム情報のURL。 |
--nest | — | true | 既存の署名を保持したままネスト署名を追加します。false の場合は既存の署名を消去します。 |
--verify | — | false | 署名追加時に証明書が信頼されていない場合はエラーを返します。 |
--dry-run | — | false | ローカルのテスト証明書を使用して署名を生成し、リモート署名インターフェースを呼び出しません。 |
ブールパラメータは必ず 参数=值 形式を使用する必要があり、スペース区切りはサポートされません:
- 正しい例:
--sha1=true --sha2=false - 誤った例:
--sha1 true --sha2 false
必須ルール
実行前に以下の条件が検証され、いずれか1つでも満たされない場合はエラーが発生して終了します:
--access-keyまたはACCESS_KEYが存在する必要があります。--access-secretまたはACCESS_SECRETが存在する必要があります。--cert-codeが存在する必要があります。--fileが存在する必要があり、ディレクトリであってはなりません。--sha1と--sha2のうち、少なくとも1つが有効になっている必要があります。
出力ファイルルール
--out が指定されていない場合:
--override | 出力動作 |
|---|---|
false(デフォルト) | 入力ファイルと同じディレクトリに出力し、ファイル名は ${name}.signed.${yyyyMMdd.HHmmss}${ext} |
true | 入力ファイルを直接上書き |
例:
app.exe → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
--override=true は元のファイルを上書きします。実行する前に必ずバックアップを作成してください。署名に失敗した場合、CLIは可能な限り未完了の出力ファイルを削除します。
アルゴリズムの選択
デフォルトではSHA2のみが有効になっています:
signtool sign -c CERT_CODE -f app.exe
SHA1 のみに署名:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false
SHA1とSHA2で同時に署名する:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
SHA1とSHA2を同時に有効化した場合、処理フローは先にSHA1を処理し、その後SHA2を処理します。SHA1は現在もサポートされていますが、新規の署名シナリオではSHA2の使用が優先されます。
タイムスタンプ設定
--timestamp と --timestamp-rfc3161 の auto 値は、検証フェーズでデフォルトアドレスに置き換えられます:
| パラメータ | auto 実際の値 | 用途 |
|---|---|---|
--timestamp | http://timestamp.sectigo.com | SHA1 Authenticode タイムスタンプ |
--timestamp-rfc3161 | http://timestamp.sectigo.com | SHA2 RFC3161 タイムスタンプ |
カスタムSHA2タイムスタンプサービス:
signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com
SHA2 タイムスタンプを無効にする:
signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=
すべてのタイムスタンプを閉じる:
signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
httpで始まるタイムスタンプアドレスのみが使用されます。- SHA1 では優先的に
--timestampを使用します;これが HTTP アドレスでない場合は、--timestamp-rfc3161の使用を試みます。 - SHA2 では
--timestamp-rfc3161を使用します。 - SHA2 でのタイムスタンプ追加に失敗した場合、Microsoft と Sectigo のデフォルトアドレスの間で自動的に1回再試行されます。
- タイムスタンプの失敗が必ずしも署名の失敗につながるわけではなく、CLI はエラーを記録し、タイムスタンプの付与されていない署名結果を保持します。
よく使われる例
環境変数で資格情報を指定し、デフォルトの SHA2 署名を使用する:
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"
signtool sign \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
パラメータを使用して直接資格情報を提供する:
signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
NICSRS アドレスを使用する:
signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
プログラムの説明と公式サイトURLを入力してください:
signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"
ネストされた署名の追加(既存の署名を保持):
signtool sign -c CERT_CODE -f app.exe --nest=true
元のファイルを上書き:
signtool sign -c CERT_CODE -f app.exe --override=true
dry-run ローカル試用署名(リモートインターフェースを呼び出しません):
signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
--dry-run はリモート署名インターフェースを呼び出しませんが、ローカルファイルの読み書きとローカルの自己署名証明書の呼び出しは引き続き行われます。現在も資格情報と証明書番号の空でないことのチェックが実行されるため、例ではプレースホルダーの資格情報を使用しています。
トラブルシューティングリファレンス
| エラーメッセージ | 考えられる原因 | 対処方法 |
|---|---|---|
access key is required... | --access-key が渡されておらず、ACCESS_KEY も設定されていません。 | 環境変数を設定するか、-k を使用してください。 |
access secret is required... | --access-secret が渡されておらず、ACCESS_SECRET も設定されていません。 | 環境変数を設定するか、-s を使用してください。 |
cert code is required... | 証明書番号が渡されていません。 | -c CERT_CODE を使用してください。 |
sha1 or sha2 is required... | SHA1 と SHA2 が両方とも無効になっています。 | 少なくとも1つのアルゴリズムを有効にしてください。 |
file <path> is a directory | --file がファイルではなくディレクトリを指しています。 | 署名対象ファイルのパスに変更してください。 |
| タイムスタンプは失敗しましたが、署名ファイルは生成されました | タイムスタンプサービスが利用できないか、証明書チェーンの検証に失敗しました。 | タイムスタンプURLを確認し、必要に応じて --timestamp-rfc3161 を変更してください。 |