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 寫入 shell 歷史或腳本倉庫,優先使用執行階段注入的環境變數或安全的 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
必填規則
執行前會檢查以下條件,任一不滿足則報錯退出:
--access-key或ACCESS_KEY必須存在。--access-secret或ACCESS_SECRET必須存在。--cert-code必須存在。--file必須存在,且不能是目錄。--sha1和--sha2至少啟用一個。
輸出檔案規則
未指定 --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 預設地址之間自動重試一次。
- 時間戳失敗不會必然導致簽名失敗,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。 | 至少啟用一個演算法。 |
file <path> is a directory | --file 指向了目錄而非檔案。 | 改為待簽名檔案的路徑。 |
| 時間戳失敗但簽名檔已產生 | 時間戳服務不可用或憑證鏈驗證失敗。 | 檢查時間戳 URL,必要時更換 --timestamp-rfc3161。 |