SignTool
SignTool 是一种命令行工具,可对文件进行数字签名、验证文件中的签名、从文件中删除签名以及时间戳文件。 有关对文件签名为何重要的信息,请参阅代码签名简介。
SignTool 可作为 Windows 软件开发工具包 (SDK) 的一部分提供。 该工具安装在 Windows SDK 安装路径的 \Bin
文件夹中,例如: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 | ...]
参数
参数 | 说明 |
---|---|
command |
指定要对文件执行的操作的四个命令(catdb 、sign 、timestamp 或 verify )之一。 有关每个命令的说明,请参见下一个表。 |
options |
用于修改命令的选项。 除全局 /q 和 /v 选项之外,每个命令均支持一组唯一选项。 |
file_name |
要进行签名的文件的路径。 |
SignTool 支持以下命令:
命令 | 说明 |
---|---|
catdb |
在目录数据库中添加或移除目录文件。 目录数据库用于自动查找目录文件,并由 GUID 标识。 有关 catdb 命令支持的选项列表,请参阅 catdb 命令选项。 |
remove |
从文件中删除签名。 有关命令支持 remove 的选项的列表,请参阅 删除命令选项。 |
sign |
对文件进行数字签名。 数字签名可以阻止文件被篡改,并且使用户能够基于签名证书验证签名者。 有关 sign 命令支持的选项列表,请参阅 sign 命令选项。 |
timestamp |
为文件添加时间戳。 有关 timestamp 命令支持的选项列表,请参阅 timestamp 命令选项。 |
verify |
验证文件的数字签名。 确定签名证书是否由受信任的颁发机构颁发、是否已撤消签名证书,以及签名证书对于特定策略是否有效(可选)。 有关 verify 命令支持的选项列表,请参阅 verify 命令选项。 |
下列选项适用于所有 SignTool 命令:
全局选项 | 说明 |
---|---|
/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 命令选项 | 描述 |
---|---|
/a |
自动选择最佳签名证书。 SignTool 查找满足所有指定条件的所有有效证书,并选择有效时间最长的证书。 如果未提供该选项,SignTool 仅查找一个有效的签名证书。 |
file /ac |
将 file 中的其他证书添加到签名块。 |
/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。 |
/dlib DLL |
指定实现用于对摘要进行签名的 AuthenticodeDigestSign 函数的 DLL。 此选项等效于将 SignTool 单独用于 /dg 、/ds 和 /di 选项。 此选项将所有三项调用为一个原子操作。 |
/dmdf Filename |
与 /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 内容指定选项。 将 Value 设置为 Embedded 可将已签名内容嵌入到 PKCS #7 文件中;设置为 DetachedSignedData 可生成分离的 PKCS #7 文件的已签名数据部分。 如果未指定 /p7ce 选项,默认情况下将嵌入已签名的内容。 |
/p7co <OID> |
指定标识已签名的 PKCS #7 内容的对象标识符 (OID)。 |
/ph |
如果支持,则生成可执行文件的页面哈希。 |
/r RootSubjectName |
指定签名证书必须链接到的根证书的主题名称。 该值可以是根证书的整个主题名称的子字符串。 |
/s StoreName |
指定要在命令搜索证书时打开的存储。 如果未指定此选项,则命令将打开 My 存储。 |
/sha1 Hash |
指定签名证书的 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 Signing 或 1.3.6.1.5.5.7.3.3 。 |
/uw |
指定 Windows System Component Verification 或 1.3.6.1.4.1.311.10.3.6 的用法。 |
有关用法示例,请参阅 Using SignTool to Sign a File(使用 SignTool 为文件签名)。
Timestamp 命令选项
下表列出了可与 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 命令选项
下表列出了可与 verify
命令一起使用的选项:
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 |
按操作系统版本验证文件。 版本参数的格式为:<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 添加到系统组件和驱动程序数据库中。 如有必要阻止替换名为 MyCatalogFileName.cat 的现有目录文件,/u
选项会生成唯一名称。
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