SignTool
SignTool 是命令行工具,可數位簽署檔案、驗證檔案中的簽章、從檔案中移除簽章,以及時間戳檔案。 如需簽署檔案為何很重要的資訊,請參閱 程式代碼簽署簡介。
SignTool 是 Windows 軟體開發工具套件 (SDK) 的一部分。 此工具會安裝在 \Bin
Windows SDK 安裝路徑的資料夾中,例如: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe
。
注意
Windows SDK、 Windows 硬體實驗室套件 (HLK)、 Windows 驅動程式套件 (WDK) 和 Windows 評定及部署套件 (ADK) 組建 20236 和更新版本會要求您指定摘要演算法。 SignTool sign
命令需要檔案摘要演算法選項 (/fd
) 和時間戳摘要演算法選項 (/td
) 分別在簽署和時間戳期間。
如果在 /fd
簽署期間未指定 ,如果在 /td
時間戳期間未指定 ,則命令會一開始擲回警告,錯誤碼 0。 在更新版本的 SignTool 中,警告會變成錯誤。 我們建議使用SHA256。 它被認為比業界的SHA1更安全。
語法
signtool [command] [options] [file_name | ...]
參數
Argument | 描述 |
---|---|
command |
四個命令之一,指定要在檔案上執行的作業之一: catdb 、 sign 、 timestamp 或 verify 。 如需每個命令的描述,請參閱下一個表格。 |
options |
修改命令的選項。 除了全域 /q 和 /v 選項外,每個命令支援一組唯一的選項。 |
file_name |
要簽署之檔案的路徑。 |
SignTool 支援下列命令:
Command | 描述 |
---|---|
catdb |
在目錄資料庫中加入或移除目錄檔。 目錄資料庫可以用來自動查閱目錄檔,並且是由 GUID 所識別。 如需命令支援 catdb 的選項清單,請參閱 catdb 命令選項。 |
remove |
從檔案移除簽章。 如需命令支援 remove 的選項清單,請參閱 移除命令選項。 |
sign |
數位簽署檔案。 數位簽名可保護檔案免於竄改,並讓使用者根據簽署憑證來驗證簽署者。 如需命令支援 sign 的選項清單,請參閱 簽署命令選項。 |
timestamp |
時間戳檔案。 如需命令支援 timestamp 的選項清單,請參閱 timestamp 命令選項。 |
verify |
驗證檔案的數字簽名。 判斷簽署憑證是否由信任的授權單位簽發、簽署憑證是否已撤銷,以及選擇性地,簽署憑證是否對特定原則有效。 如需命令支援 verify 的選項清單,請參閱 驗證命令選項。 |
下列選項適用於所有 SignTool 命令:
Global 選項 | 描述 |
---|---|
/q |
如果命令成功執行則不顯示任何輸出,如果命令失敗則顯示最少的輸出。 |
/v |
不論命令執行成功或失敗,都顯示詳細資訊輸出,並顯示警告訊息。 |
/debug |
顯示偵錯資訊。 |
Catdb 命令選項
下表列出可與 命令搭配 catdb
使用的選項:
Catdb 選項 | 描述 |
---|---|
/d |
指示預設目錄資料庫已經更新。 如果您未使用 /d 或 /g ,SignTool 會更新系統元件和驅動程式資料庫。 |
/g GUID |
指定 GUID 所識別的目錄資料庫已更新。 |
/r |
從目錄資料庫移除指定的目錄。 如果未指定此選項,SignTool 會將指定的目錄新增至目錄資料庫。 |
/u |
指定為加入的目錄檔自動產生一個唯一的名稱。 必要時,目錄檔會重新命名,以避免與現有的目錄檔發生名稱衝突。 如果未指定此選項,SignTool 會覆寫任何與指定目錄同名的現有目錄。 |
注意
目錄資料庫用於自動查閱目錄檔案。
拿掉命令選項
下表列出可與 命令搭配 remove
使用的選項:
拿掉選項 | 描述 |
---|---|
/c |
拿掉簽章中簽署者憑證以外的所有憑證。 |
/q |
成功時沒有輸出,而且失敗時的輸出最少。 一如往常,SignTool 會在 0 成功和 1 失敗時傳回。 |
/s |
完全移除簽章。 |
/u |
從簽章中移除未經驗證的屬性,例如雙重簽章和時間戳。 |
/v |
列印詳細資訊成功和狀態消息。 這也可能會提供錯誤的詳細資訊。 |
Sign 命令選項
下表列出可與 命令搭配 sign
使用的選項:
Sign 命令選項 | 描述 |
---|---|
/a |
自動選取最佳的簽署憑證。 SignTool 會尋找符合所有指定條件的所有有效憑證,並選取最長有效憑證。 如果此選項不存在,SignTool 預期只會找到一個有效的簽署憑證。 |
/ac 檔 |
將另一個憑證從 檔案 新增至簽章區塊。 |
/as |
附加這個簽章。 如果沒有主要簽章存在,此簽章會改為成為主要簽章。 |
/c CertTemplateName |
指定適用於簽署憑證的「憑證範本名稱」(Certificate Template Name),這是一個 Microsoft 擴充功能。 |
/csp CSPName |
指定包含私密金鑰容器的密碼編譯服務提供者 (Cryptographic Service Provider,CSP)。 |
/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。 此選項相當於搭配、 /ds 和 /di 選項分別/dg 使用 SignTool。 此選項會叫用這三項作為一個不可部分完成的作業。 |
/dmdf 檔名 |
搭配 /dg 選項使用時,在不修改的情況下,將檔案的內容傳遞至函 AuthenticodeDigestSign 式。 |
/ds |
僅簽署摘要。 輸入檔應該是 選項所產生的 /dg 摘要。 輸出檔案為:File.signed>。< |
/du URL |
為已簽署的內容之擴充描述指定統一資源定位器 (Uniform Resource Locator,URL)。 |
/dxml |
搭配 /dg 選項使用時,會產生 XML 檔案。 輸出檔案為:Path\FileName>.dig.xml。<>< |
/f SignCertFile |
指定檔案中的簽署憑證。 如果檔案為「個人資訊交換」(PFX) 格式並且受密碼保護,請使用 /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 密碼 |
指定用來開啟 PFX 檔案的密碼 /f 使用 選項來指定 PFX 檔案。 |
/p7 路徑 |
指定為每個指定內容檔產生公開金鑰加密標準 (PKCS) #7 檔案。 PKCS #7 檔案的名稱為 path\filename.p7。<><> |
/p7ce 價值 |
指定已簽署的 PKCS #7 內容的選項。 將 [值Embedded ] 設定為 ,以將已簽署的內容內嵌在 PKCS #7 檔案中,或設定為 DetachedSignedData ,以產生已中斷連結 PKCS #7 檔案的已簽署數據部分。 /p7ce 如果未指定選項,則預設會內嵌已簽署的內容。 |
/p7co <OID> |
指定識別已簽署 PKCS #7 內容的物件識別項 (OID)。 |
/ph |
如果支援,則產生可執行檔的頁面雜湊。 |
/r RootSubjectName |
指定簽署憑證必須鏈結之根憑證的主體名稱。 這個值可以是完整根憑證主體名稱的子字串。 |
/s StoreName |
指定要在命令搜尋憑證時開啟的存放區。 如果未指定此選項,命令會 My 開啟存放區。 |
/sha1 散列 |
指定簽署憑證的 SHA1 雜湊。 當多個憑證符合其餘選項所指定的準則時,通常會使用SHA1哈希。 |
/sm |
指定命令使用電腦存放區,而不是使用者存放區。 |
/t URL |
指定時間戳記伺服器的 URL。 如果此選項或 /tr 未指定,則簽署的檔案不會加上時間戳。 如果時間戳失敗,命令會產生警告。 此選項無法與 選項搭配 /tr 使用。 |
/td alg |
與 /tr 選項一起使用以要求 RFC 3161 時間戳記伺服器使用的摘要演算法。 注意:如果在 /td 時間戳時未指定 ,命令會產生錯誤。 |
/tr URL |
指定 RFC 3161 時間戳記伺服器的 URL。 如果此選項或 /t 未指定,則簽署的檔案不會加上時間戳。 如果時間戳失敗,命令會產生警告。 此選項無法與 選項搭配 /t 使用。 |
/u 用法 |
指定在簽署憑證時必須存在的增強金鑰使用方法 (Enhanced Key Usage,EKU)。 使用方法的值可以利用 OID 或字串指定。 預設用法為 Code Signing 或 1.3.6.1.5.5.7.3.3 。 |
/uw |
指定或1.3.6.1.4.1.311.10.3.6 的使用Windows System Component Verification 方式。 |
如需使用方式範例,請參閱使用 SignTool 簽署檔案。
Timestamp 命令選項
下表列出可與 命令搭配 timestamp
使用的選項:
時間戳選項 | 描述 |
---|---|
/p7 |
為 PKCS #7 檔案加上時間戳記。 |
/t URL |
指定時間戳記伺服器的 URL。 要加上時間戳記的檔案必須先經過簽署。 必須有 /t 或 /tr 任一選項。 |
/td alg |
與 /tr 選項一起使用以要求 RFC 3161 時間戳記伺服器使用的摘要演算法。 注意:如果在 /td 時間戳時未指定 ,命令會產生警告。 |
/tp 指數 |
在 index 的簽章加上時間戳記。 |
/tr URL |
指定 RFC 3161 時間戳記伺服器的 URL。 要加上時間戳記的檔案必須先經過簽署。 必須有 /tr 或 /t 任一選項。 |
驗證命令選項
下表列出可與 命令搭配 verify
使用的選項:
Verify 選項 | 描述 |
---|---|
/a |
指定所有方法都可以用來驗證檔案。 首先,SignTool 會搜尋目錄資料庫,以判斷檔案是否在目錄中登入。 如果檔案未在任何目錄中登入,SignTool 會嘗試驗證檔案的內嵌簽章。 在驗證可能或可能未登入目錄中的檔案時,建議您使用此選項。 可能或可能未簽署的檔案範例包括 Windows 檔案或驅動程式。 |
/ad |
使用預設目錄資料庫尋找目錄。 |
/all |
使用多個簽章來驗證檔案中的所有簽章。 |
/as |
使用系統元件 (驅動程式) 目錄資料庫尋找目錄。 |
/ag CatDBGUID |
在 GUID 所識別的目錄資料庫中尋找目錄。 |
/c CatFile |
依名稱指定目錄檔。 |
/d |
列印描述和描述 URL。 Windows Vista 和更早版本:不支援此選項。 |
/ds 指數 |
驗證特定位置的簽章。 |
/hash {SHA1|SHA256} |
指定在目錄中搜尋檔案時,要使用的選擇性雜湊演算法。 |
/kp |
使用 x64 核心模式驅動程式簽署原則來執行驗證。 |
/ms |
使用多個驗證語意。 此行為是 WinVerifyTrust 呼叫的預設值。 |
/o 版本 |
根據作業系統版本驗證檔案。 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 remove /s MyFile.exe