SignTool

SignTool 是一种命令行工具,用于对文件进行数字签名、验证文件中的签名和时间戳文件。 有关签名文件为何重要的信息,请参阅 代码签名简介

该工具安装在 Microsoft Windows 软件开发工具包 (SDK) 安装路径的 \Bin 文件夹中,例如: C:\Program Files (x86) \Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe

SignTool 作为 Windows SDK 的一部分提供,可从 Windows SDK 下载。

注意

Windows 10 SDK、Windows 10 HLK、Windows 10 WDK 和 Windows 10 ADK 版本 20236 及更高版本要求指定摘要算法。 SignTool sign 命令需要文件摘要算法选项 (/fd) ,时间戳摘要算法选项分别 (/td 签名和时间戳期间) 。

如果在 /fd 签名期间未指定 ,如果在 /td 时间戳期间未指定 ,则命令最初会引发警告,错误代码为 0。 在更高版本的 SignTool 中,警告变为错误。 建议使用 SHA256。 业内认为它比 SHA1 更安全。

语法

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

参数

参数 说明
command 指定要对文件执行的操作的四个命令之一:catdbsigntimestamp、 或 verify。 有关每个命令的说明,请参见下一个表。
options 用于修改命令的选项。 除全局 /q/v 选项之外,每个命令均支持一组唯一选项。
file_name 要进行签名的文件的路径。

SignTool 支持以下命令:

命令 说明
catdb 在目录数据库中添加或移除目录文件。 目录数据库用于自动查找目录文件,并由 GUID 标识。 有关命令支持 catdb 的选项列表,请参阅 catdb 命令选项
sign 对文件进行数字签名。 数字签名可保护文件免遭篡改,并使用户能够基于签名证书验证签名者。 有关命令支持 sign 的选项的列表,请参阅 签名命令选项
timestamp 时间戳文件。 有关命令支持 timestamp 的选项列表,请参阅 timestamp 命令选项
verify 验证文件的数字签名。 确定签名证书是否由受信任的颁发机构颁发、签名证书是否已吊销,以及签名证书是否对特定策略有效(可选)。 有关命令支持 verify 的选项列表,请参阅 verify 命令选项

以下选项适用于所有 SignTool 命令。

全局选项 描述
/q 如果命令运行成功,则不显示输出;如果命令运行失败,则显示最小输出。
/v 无论命令是否运行成功,都显示详细输出,并显示警告消息。
/debug 显示调试信息。

Catdb 命令选项

下表列出了可与 catdb 命令一起使用的选项。

Catdb 选项 描述
/d 指定更新默认目录数据库。 如果不使用 /d/g,SignTool 将更新系统组件和驱动程序数据库。
/gGUID 指定更新 GUID 标识的目录数据库。
/r 从目录数据库中删除指定的目录。 如果未指定此选项,SignTool 会将指定的目录添加到目录数据库。
/u 指定自动为添加的目录文件生成唯一名称。 如有必要,重命名目录文件以阻止与现有目录文件发生名称冲突。 如果未指定此选项,SignTool 将覆盖与指定目录同名的任何现有目录。

注意

目录数据库用于自动查找目录文件。

签名命令选项

下表列出了可与 sign 命令一起使用的选项。

Sign 命令选项 描述
/a 自动选择最佳签名证书。 SignTool 查找满足所有指定条件的所有有效证书,并选择有效期最长的证书。 如果此选项不存在,SignTool 应仅找到一个有效的签名证书。
/ac 文件 文件中 的另一个证书添加到签名块。
/as 追加此签名。 如果不存在主签名,则此签名将改为为主签名。
/c CertTemplateName 指定用于对证书进行签名的证书模板名(一个 Microsoft 扩展)。
/csp CSPName 指定包含私钥容器的加密服务提供程序 (CSP)。
/d Desc 指定已签名内容的说明。
/dg路径 生成要签名的摘要和未签名的 PKCS7 文件。 输出摘要和 PKCS7 文件为 <Path>\<FileName.dig><Path>\<FileName.p7u>。 若要输出额外的 XML 文件,请使用 /dxml
/di路径 通过将签名摘要引入到未签名的 PKCS7 文件来创建签名。 输入有符号摘要和未签名的 PKCS7 文件应为 <Path>\<FileName.dig.signed><Path>\<FileName.p7u>
/dlibDll 指定实现要签署摘要的 AuthenticodeDigestSign 函数的 DLL。 此选项等效于将 SignTool 与 /dg/ds/di 选项分开使用。 此选项将三者作为一个原子操作调用。
/dmdfFilename 与 选项一起使用 /dg 时,无需修改即可将文件的内容传递给 AuthenticodeDigestSign 函数。
/ds 仅对摘要进行签名。 输入文件应为 选项生成的 /dg 摘要。 输出文件为:<File.signed>
/du URL 为已签名内容的详细说明指定统一资源定位器 (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 Password 指定打开 PFX 文件时要使用的密码。 /f使用 选项指定 PFX 文件。
/p7路径 指定为每个指定的内容文件生成的公钥加密标准 (PKCS) #7 文件。 PKCS #7 文件命名为 <path>\<filename.p7>
/p7ce Value 为已签名的 PKCS #7 内容指定选项。 将 “值 ”设置为 Embedded 以将签名内容嵌入 PKCS #7 文件中,或设置为 DetachedSignedData 以生成分离的 PKCS #7 文件的已签名数据部分。 /p7ce如果未指定 选项,默认情况下会嵌入已签名的内容。
/p7co<OID> 指定标识已签名的 PKCS #7 内容的对象标识符 (OID)。
/ph 如果支持,则生成可执行文件的页面哈希。
/r RootSubjectName 指定签名证书必须链接到的根证书的主题名称。 该值可以是根证书的整个主题名称的子字符串。
/s StoreName 指定要在命令搜索证书时打开的存储。 如果未指定此选项,该命令将 My 打开存储区。
/sha1Hash 指定签名证书的 SHA1 哈希。 当多个证书满足其余选项指定的条件时,通常使用 SHA1 哈希。
/sm 指定命令使用计算机存储,而不是用户存储。
/t URL 指定时间戳服务器的 URL。 如果未指定此选项或 /tr ,则签名文件不会加时间戳。 如果时间戳失败,该命令将生成警告。 此选项不能与 选项一 /tr 起使用。
/td alg 将此选项与 /tr 选项一起使用可请求 RFC 3161 时间戳服务器使用的摘要算法。 注意:如果在 /td 时间戳时未指定 ,则命令将生成错误。
/tr URL 指定 RFC 3161 时间戳服务器的 URL。 如果未指定此选项或 /t ,则签名文件不会加时间戳。 如果时间戳失败,该命令将生成警告。 此选项不能与 选项一 /t 起使用。
/u Usage 指定签名证书中必须存在的增强型密钥用法 (EKU)。 可以通过 OID 或字符串指定该用法的值。 默认用法为 Code Signing1.3.6.1.5.5.7.3.3
/uw 指定 或 1.3.6.1.4.1.311.10.3.6Windows System Component Verification用法。

有关用法示例,请参阅 Using SignTool to Sign a File(使用 SignTool 为文件签名)。

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 选项 描述
/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