SignTool

SignTool (Signtool.exe) 是一种命令行 CryptoAPI 工具,用于对文件进行数字签名、验证文件中的签名和时间戳文件。

    SignTool [Operation] [Options] [FileName ...]

操作、选项和参数的部分列表

Operations

catdb
配置 SignTool 以更新目录数据库。 SignTool 将目录文件添加到数据库或从数据库中删除目录。 默认情况下, catdb 命令会将名称由 FileName 参数指定的文件添加到系统组件 (驱动程序) 数据库。

注意

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

sign
配置 SignTool 以对名称由 FileName 参数指定的文件进行数字签名。

timestamp
配置 SignTool 以对其名称由 FileName 参数指定的文件进行时间戳。

verify
配置 SignTool 以验证其名称由 FileName 参数指定的文件的数字签名。

Catdb 操作选项

/d
配置 SignTool 以更新目录数据库。 如果未使用 /d/g 选项,SignTool 将更新系统组件和驱动程序数据库。

/gGuid
配置 SignTool 以更新 GUID 参数标识的目录数据库。

/R
配置 SignTool 以从目录数据库中删除其名称由 FileName 参数指定的每个目录文件。 如果未指定此选项,SignTool 会将指定的目录文件添加到目录数据库。

/u
如有必要,将 SignTool 配置为为目录文件生成唯一名称,以防止与目录数据库中的现有目录文件发生冲突。 如果未指定此选项,SignTool 将覆盖与要添加的目录同名的任何现有目录。

签名操作选项

/a 配置 SignTool 以自动选择最佳签名证书。 如果此选项不存在,SignTool 应只找到一个签名证书。

/acCrossCertFileName
指定与软件发布者证书一起使用的跨证书文件的名称, (SPC) 名为 CertificateName 且安装在证书存储 区 StoreName 中。 仅当签名证书是 SPC 时,才应使用此选项。

/cCertTemplateName
指定用于对证书进行签名的证书模板名(一个 Microsoft 扩展)。

/cspCSPName
指定包含私钥容器的加密服务提供程序 (CSP)。

/dDesc
指定已签名内容的说明。

/duURL
指定已签名内容的扩展说明的 URL。

/fSignCertFile
指定文件中的签名证书。 仅支持个人信息交换 (PFX) 文件格式。 可以使用 Pvk2Pfx 工具将 SPC 和 PVK 文件转换为 PFX 格式。

如果文件采用受密码保护的 PFX 格式,请使用 /p 选项指定密码。 如果文件不包含私钥,请使用 /csp/k 选项分别指定 CSP 和私钥容器名称。

/Fd
指定要用于创建文件签名的文件摘要算法。 默认值为 SHA1。

/iIssuerName
指定签名证书的颁发者的名称。 该值可以是整个颁发者名称的子字符串。

/jDLL
指定提供签名特性的 DLL 的名称。

/jpParameterName
指定传递给 /j 命令指定的 DLL 的参数。

/kcPrivKeyContainerName
指定私钥的密钥容器名称。

/nSubjectName
指定签名证书的主题的名称。 该值可以是整个主题名称的子字符串。

/nph
如果支持,则取消可执行文件的页面哈希。 默认值由 SIGNTOOL_PAGE_HASHES 环境变量和 wintrust.dll 版本决定。 对于非 PE 文件,忽略此选项。

/pPassword
指定打开 PFX 文件时要使用的密码。 可以使用 /f 选项指定 PFX 文件

/p7路径
指定为每个指定的内容文件生成的公钥加密标准 (PKCS) #7 文件。 PKCS #7 文件命名为路径\文件名.p7。

/p7ce
为已签名的 PKCS #7 内容指定选项。 将值设置为“嵌入的”,可将已签名内容嵌入到 PKCS #7 文件中,或设置为“DetachedSignedData”以便生成分离的 PKCS #7 文件的已签名数据部分。 如果未使用 /p7ce 选项,则默认嵌入签名内容。

/p7coOID
指定标识已签名的 PKCS #7 内容的对象标识符 (OID)。

/Ph 如果支持,则为可执行文件生成页哈希。

/rRootSubjectName
指定签名证书必须链接到的根证书的使用者名称。 该值可以是根证书的整个主题名称的子字符串。

/sStoreName
指定要在搜索用于对文件进行签名的证书时打开的证书存储的名称。 如果未指定此选项,则会打开 “我的 证书存储”。

/sha1哈希
指定签名证书的 SHA1 哈希。

/Sm
将 SignTool 配置为使用计算机证书存储而不是用户证书存储。

/tURL
指定时间戳服务器的 URL。 如果未提供此选项,则签名文件不会带时间戳。 目录文件或驱动程序文件应带有时间戳,因为如果签名者的密钥被泄露,时间戳将提供撤销用于对文件进行签名的密钥所需的信息。

/tdalg
与 /tr 选项一起使用,请求 RFC 3161 时间戳服务器使用的摘要算法。

/trURL
指定 RFC 3161 时间戳服务器的 URL。 如果此选项 (或 /t) 不存在,则签名文件不会加时间戳。 如果时间戳操作失败,将生成一个警告。 此选项不能与 /t 选项一起使用。

/uUsage
指定签名证书中必须存在的增强型密钥用法 (EKU)。 可以通过 OID 或字符串指定该用法的值。 默认用法为“代码签名”(1.3.6.1.5.5.7.3.3)。

/微波 指定“Windows 系统组件验证” (1.3.6.1.4.1.311.10.3.6) 的用法。

时间戳操作选项

/p7 时间戳 PKCS #7 文件。

/tURL
指定时间戳服务器的 URL。 要设置时间戳的文件必须以前已签名

/tdalg
请求 RFC 3161 时间戳服务器使用的摘要算法。 /td/tr 选项一起使用。

/tpindex
对引用处的签名进行时间戳操作。

/tralg
请求 RFC 3161 时间戳服务器使用的摘要算法。 /td/tr 选项一起使用。

验证操作选项

/a
指定可以使用所有方法来验证文件。 首先,搜索目录数据库以确定是否在目录中对文件进行签名。 如果文件未在任何目录中登录,SignTool 将尝试验证文件的嵌入签名。 验证可以或不能在目录中进行签名的文件时,建议使用该选项。

/广告
指定仅搜索默认目录数据库以查找文件已登录的目录。

/all
验证包含多个签名的文件中的所有签名。

/as
指定仅搜索系统组件 (驱动程序) 目录数据库中的文件已登录目录。

/agCatDBGUID
指定仅搜索通过 CatDBGUID 参数标识的目录数据库,以查找文件已登录的目录。

/cCatalogFileName
指定目录文件的名称。

/D 指定签名工具应打印说明和说明 URL。

/dsindex
验证指定位置的签名。

/hash {SHA1|SHA256}
指定在目录中搜索文件时要使用的可选哈希算法。

/Kp
配置 SignTool 以验证 FileName 参数指定的每个文件的数字签名是否符合 内核模式代码签名策略 以及 Windows Vista 及更高版本的 Windows 的 PnP 设备安装签名要求 。 如果未指定此选项,SignTool 仅验证签名是否符合 PnP 设备安装签名要求。

/女士
使用多个验证语义。 这是在 Windows 8 及更高版本上调用 WinVerifyTrust 函数的默认行为。

/o版本
根据操作系统版本验证文件。 Version 参数的格式为 PlatformID:VerMajor.VerMinor.BuildNumber

建议使用 /o 选项。 如果未指定 /o ,SignTool 可能会返回意外结果。 例如,如果不包含 /o 选项,在较旧的操作系统上正确验证的系统目录可能无法在较新的操作系统上正确验证。

/p7
验证 PKCS #7 文件。 无现有策略用于 PKCS #7 验证。 该签名处于选中状态,并为签名证书生成了链。

/Pa
配置 SignTool 以验证 FileName 参数指定的每个文件的数字签名是否符合 PnP 设备安装签名要求

注意

此选项不能与 catdb 选项一起使用。

/pgPolicyGUID
通过 GUID 指定验证策略。 PolicyGUID 对应于验证策略的 ActionID。

注意

此选项不能与 catdb 选项一起使用。

/Ph 指定签名工具应打印并验证页面哈希值。

/rRootSubjectName
指定签名证书必须链接到的根证书的使用者名称。 该值可以是根证书的整个主题名称的子字符串。

/tw
指定在签名未加时间戳的情况下生成警告。

常规选项

/q
将 SignTool 配置为在成功执行时不显示输出,为失败的执行显示最小输出。

/v
配置 SignTool 以显示操作和警告消息的详细版本。

/?
将 SignTool 配置为在命令窗口中显示帮助信息。

文件名。。。
指定一个或多个文件名的列表。 SignTool 将对指定的文件进行签名、时间戳或验证,具体取决于命令。 如果使用 catdb 命令,SignTool 将在目录数据库中添加或删除指定的文件。

对于 符号时间戳验证 命令,文件可以是 驱动程序包 的目录文件或驱动程序文件。

对于 catdb 命令,文件必须是 驱动程序包的目录文件。

注解

SignTool 支持大量选项。 本主题中所述的选项仅限于可用于对驱动程序包或驱动程序文件进行签名或验证的选项。

有关 SignTool 参数的完整列表,请参阅 Microsoft SignTool 网站。

有关对文件进行签名的详细信息,请参阅 Microsoft 加密工具 网站。

32 位版本的 SignTool 位于 WDK 的 bin\i386 文件夹中。 该工具的 64 位版本位于 WDK 的 bin\amd64 和 bin\ia64 文件夹中。

示例

以下示例演示如何使用软件发布者证书 (SPC) 和相应的交叉证书对 驱动程序包的 目录文件进行签名。 此示例对 64 位版本的 Windows Vista 和更高版本的 Windows 的驱动程序包进行签名有效,这将强制实施内核模式代码签名策略。 该示例将驱动程序包的目录文件签名 AbcCatFileName.cat。 为了对目录文件进行签名,此示例使用交叉证书 AbcCrossCertificate 和 AbcSPCCertificate 证书。 AbcSPCCertificate 证书位于 AbcCertificateStore 证书存储区中。

该示例还使用公开可用的时间戳服务器对目录文件进行签名。 时间戳服务器由 DigiCert 提供,其 URL 为 http://timestamp.digicert.com

SignTool sign /ac AbcCrossCertificate.cer /s AbcCertificateStore /n AbcSPCCertificate /t http://timestamp.digicert.com AbcCatFileName.cat

以下示例演示如何使用 SPC 和交叉证书在驱动程序文件中嵌入签名。 所有参数都与为目录文件签名的示例中的相同,只不过已签名的文件AbcDriverFile.sys而不是 AbcCatFileName.cat 目录文件。

SignTool sign /ac AbcCrossCertificate.cer /s AbcCertificateStore /n AbcSPCCertificate /t http://timestamp.digicert.com AbcDriverFile.sys

下面是如何使用商业发布证书或商业测试证书对驱动程序包的目录文件进行签名的示例。 此示例对 32 位版本的 Windows Vista 和更高版本的 Windows 的驱动程序包进行签名有效,后者不强制实施内核模式代码签名策略。 该示例将驱动程序包的目录文件签名 CatalogFileName.cat。 该示例使用位于 TestCertificateStore 证书存储中的 AbcTestCertificate 测试证书对目录文件进行签名。

该示例还使用公开可用的时间戳服务器对目录文件进行签名。 时间戳服务器由 DigiCert 提供,其 URL 为 http://timestamp.digicert.com

SignTool sign /s TestCertificateStore /n AbcTestCertificate /t http://timestamp.digicert.com CatalogFileName.cat

验证示例

以下示例演示如何验证 驱动程序包目录 文件的签名是否符合内核模式代码签名策略和 PnP 设备安装签名要求。 该示例验证目录文件 AbcCatalogFile.cat 的签名。

SignTool verify /kp CatalogFileName.cat

以下示例演示如何验证驱动程序包的目录文件中列出的文件的签名是否符合内核模式代码签名策略和 PnP 设备安装签名要求。 该示例验证文件 AbcDriverPackage.inf 的签名,该文件必须在目录文件 CatalogFileName.cat 中具有指纹条目。

SignTool verify /kp /c CatalogFileName.cat AbcDriverPackage.inf

以下示例演示如何验证嵌入签名是否符合 Windows Vista 和更高版本的 Windows 上的内核模式代码签名策略。 该示例验证AbcDriverFile.sys驱动程序文件中嵌入的签名。

SignTool verify /kp AbcDriverFile.sys

以下示例演示如何验证 驱动程序包目录 文件的签名是否符合 PnP 设备安装签名要求。 该示例验证目录文件 CatalogFileName.cat 的签名。

SignTool verify /pa CatalogFileName.cat

将目录文件添加到系统组件 (驱动程序) 数据库的示例

下面的示例演示如何使用 SignTool 将目录文件 CatalogFileName.cat 添加到系统组件 (驱动程序) 数据库。 /v 选项将 SignTool 配置为在详细模式下运行,/u 选项将 SignTool 配置为为正在添加的目录文件生成唯一名称(如有必要),以防止替换与 CatalogFileName.cat 同名的现有目录文件。

SignTool catdb /v /u CatalogFileName.cat