在 Windows 上安装 SignTool EXE以及代码签名示例

举报
Tiamo_T 发表于 2022/10/20 13:57:02 2022/10/20
【摘要】 如果您的公司环境也有一些 Windows 服务器和应用程序,那么您最终可能会遇到必须对 Windows 文件进行数字签名的情况。

如果您的公司环境也有一些 Windows 服务器和应用程序,那么您最终可能会遇到必须对 Windows 文件进行数字签名的情况。

对 Windows 文件(如 EXE、DLL、OCX 或 CAB 文件)进行数字签名的过程称为代码签名。

为此,您应该从赛门铁克、Thawte 或 Godaddy 等受信任的提供商处购买代码签名证书。

购买代码签名证书后,您应该使用名为 signtool 的工具对文件进行签名。

本教程解释了以下内容:

  1. 如何在 Windows 10(和 Windows 7)中安装 SignTool
  2. 使用 SHA1 的默认代码符号示例
  3. 使用 SHA256 算法的代码签名
  4. 使用 PFX 文件或 P12 文件的代码签名(默认 SHA1)
  5. 使用 PFX 文件或 P12 文件的代码签名(对于 SHA256)
  6. 其他 SignTool 选项

如果您已经在您的机器上安装了 signtool,并且正在寻找有关如何使用默认选项对签名进行编码的快速片段,那么就是这里。在此示例中,我正在签署 geekstuff.exe 文件。

signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /v "c:\hgst.exe"

signtool.exe 是 Windows SDK 的一部分。如果您还没有它,您应该首先在您的系统上下载安装 Windows SDK。


下载 Windows SDK

如果您在 Windows 7 机器上安装它,请从此处下载“Microsoft Windows SDK for Windows 7 and .NET Framework 4” 。

如果您在 Windows 10 机器上安装它,可以使用以下两个选项之一安装“Windows 10 SDK”:

  1. 下载“ Windows 10 SDK ”独立版并安装。(这是推荐选项)
  2. 下载“Visual Studio”并安装它。“Windows 10 SDK”是 Visual Studio 的一部分。

如果您的系统已经有 Visual Studio,则转到控制面板 -> 程序和功能 -> 找到“Microsoft Visual Studio” -> 单击“更改” -> 这将启动 Visual Studio 安装程序。

展开“Publishing Tools” -> 展开“Universal Windows App Development Tools” -> 在此下,选择“Windows 10 SDK”进行安装。

安装 Windows SDK

一旦您为您的系统下载了适当的 SDK 安装程序包,安装它就相当简单了,因为您只需要按照屏幕上的说明进行操作即可。

以下是在 Windows 7 机器上安装 Windows SDK 的摘要屏幕。

在 Win 7 上安装 Windows SDK

在安装 SDK 期间,我收到此警告消息:“某些 Windows SDK 组件需要 RTM .NET Framework 4。安装程序检测到 .NET Framework 4 的预发布版本。”

如果您没有安装 .NET 框架,或者没有最新的 .NET

安装 Windows .NET

在 Windows 7 上,您可能会在安装 Windows SDK 7.1 期间收到以下错误消息:

安装“Microsoft Windows SDK for Windows 7”产品报告了以下错误:请参阅 Samples\Setup\HTML\ConfigDetails.htm 文档了解更多信息。请尝试解决问题,然后重新启动 Windows SDK 安装程序。

当您尝试在安装了较新版本的 Visual C++ 2010 的系统上安装 Windows SDK 时,会发生上述错误。

解决方法是卸载以下两个组件:

  • Microsoft Visual C++ 2010 x86 Redistributable – 10.0.40219
  • Microsoft Visual C++ 2010 x64 Redistributable – 10.0.40219

卸载上述两个后,重新安装 Windows SDK,它应该可以正常工作,没有任何问题。如果您愿意,您可以在安装 SDK 后随时返回并安装最新版本的 Visual C++ 2010。

选择合适的 CSP 和哈希算法

当您从提供商处购买代码签名时,有时他们可能会要求您在 Internet Explorer 上执行此过程,这样他们就可以适当地更新您的本地数字证书存储。

当您购买代码签名时,它会要求您允许代表您执行数字证书操作。在此处单击“确定”。这将执行捕获 CSR 操作。

在购买代码签名期间,请确保正确选择了以下选项:

首先,确保加密服务提供程序 (CSP) 设置为“Microsoft Enhanced Cryptographic Provider v1.0”(或更高版本)。

其次,验证签名散列算法选择是否合适。您将在这里有以下两个选择:

  • I’m signing application that don’t run in kernel mode
  • I’m signing kernel-mode drivers and software for Windows Vista and 7.

在此过程中,这还将创建一个新的 RSA 交换密钥。在以下对话框中单击确定。

创建新的 RSA 交换密钥

最后,购买证书后,您可以从提供商处“领取”证书。在此过程中,它会再次询问您是否允许代表您执行数字证书操作。在此处单击“确定”。这将直接从提供程序下载证书到您的本地证书存储。

然后,从您的提供商处下载的证书将在 signtool 过程中使用。

示例 1:使用 SHA1 的默认代码符号示例

在 Windows 7(或其他旧版本)上:

cd "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin"
signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /v "c:\hgst.exe"

在 Windows 10 上:

cd "c:\Program Files (x86)\Windows Kits\10\bin\x86"
(or)
cd "c:\Program Files (x86)\Windows Kits\10\bin\x64\"

signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /v "c:\hgst.exe"

在上面的命令中:

  • signtool.exe - 这是用于签署您的 EXE 或 DLL 或 CAB 或 OCX 文件的 Signtool 实用程序
  • sign – 这是 signtool 的子命令,表示我们将执行代码签名过程
  • /a - 这里的“a”代表自动。此选项将自动选择最佳签名证书。当您可能有多个签名证书时使用此选项。如果您只有一个签名证书,则无需提供此选项。
  • /t - 这里的“t”代表时间戳服务器。在 /t 之后,您应该指定时间戳服务器 URL。这个很重要。如果您不指定此选项,当您的文件被签名时,它不会被时间戳。您可以使用任何时间戳服务器 URL。我使用了来自威瑞信的 URL。
  • /v - 这里的“v”代表详细。这将显示 signtool 执行的详细输出。这还将显示适当的成功、错误和警告消息。
  • “c:\thegeekstuff.exe”——这应该是最后一个参数,它是完整路径和您要进行代码签名的文件的名称。

在执行上述命令时,它可能会弹出以下窗口,说明它正在使用您的私钥对数据进行签名。在此处单击“确定”。

使用 Key signtool 的代码签名数据

在此示例中,以下是上述命令的部分输出。这表明给定的 EXE 文件已成功签名。

Issued to:
Expires: Sun Jan 1 23:59:59 2020
SHA1 hash: DDF323EDB783

Done Adding Additional Store
Successfully signed and timestamped: c:\hgst.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

验证代码签名:在对文件进行代码签名后,要进行验证,请执行以下操作:选择签名文件 -> 鼠标右键单击 -> 属性 -> 单击“数字签名”选项卡 -> 在“签名列表”中,选择签名,然后单击“详细信息”->单击“查看证书”以查看此文件上的证书的详细信息。

附带说明一下,如果您使用的是早期版本的 Windows,例如(Windows Visa、Windows XP 等),signtool 支持一个名为“signwizard”的选项,它将启动一个自我指导的代码签名向导,帮助您签名此处解释的证书。但是,较新的 Windows 系统不再支持 signwizard。

示例 2:使用 SHA256 算法的代码签名

要使用 SHA256 进行代码签名,请在 Windows 命令提示符中输入以下命令。

signtool.exe sign /a /tr http://timestamp.geotrust.com/tsa /td sha256 /fd sha256 /v "c:\hgst.exe"

在上面的命令中:

  • /tr – 这里的“tr”代表时间戳服务器 RFC 3161。为此,您必须确保时间戳服务器支持 RFC 3161。如果不是,这将返回如下所示的错误消息。我使用了 geotrust.com URL。您还可以使用此 RFC 3161 URL:http://timestamp.digicert.com
  • /td – 这里的“td”代表时间服务器摘要算法。这用于从指定的 RFC 3161 时间服务器请求指定的摘要算法(在本例中为 sha256)。确保 /td 开关在 /tr 开关之后声明。如果您在 /tr 开关之前指定此选项,则时间戳将从 SHA1 算法和您希望的 SHA256 返回。
  • /fd - 这里的“fd”代表文件摘要算法。默认情况下,当您不指定此参数时,它将使用 SHA-1 算法。在此示例中,它将使用 SHA256 算法对文件进行数字签名。

错误 1:如果在给 /td 时指定 /t 选项(而不是 /tr),则会抛出以下不兼容选项错误消息。

C:\> signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /td sha256 /fd sha256 /v "c:\hgst.exe"
SignTool Error: The /t option is incompatible with the /td option.

错误 2:如果您指定非 RFC 3161 时间戳 URL,您将收到以下 SignTool 错误:无法访问指定的时间戳服务器或返回无效响应

C:\> signtool.exe sign /a /tr http://timestamp.verisign.com/scripts/timstamp.dll /td sha256 /fd sha256 /v "c:\hgst.exe"
SignTool Error: 
  The specified timestamp server either could not be reached or returned an invalid response.
  This may happen if you specify an RFC 3161 timestamp URL but used
  the /t option or you specified a legacy Authenticode timestamp URL
  but used the /tr option.

  SignTool Warning: Signing succeeded, but an error occurred while attempting to  timestamp

示例 3:使用 PFX 文件或 P12 文件的代码签名(默认 SHA1)

PFX 代表个人信息交换。它也被称为 PKCS #12。这通常会创建一个带有 .PFX 扩展名或 .P12 扩展名的文件。

如前面的示例所示,如果代码签名证书在您的 IE(Internet Explorer)浏览器或 Chrome 浏览器上,则上述 signtool.exe 命令将能够自动访问它而不会出现任何问题。

但是,如果您使用浏览器(例如 firefox)或在其他操作系统(如 MacOS)上从您的提供商处获取证书,请使用此方法。在这种情况下,将 PFX 文件(或 P12 文件)从浏览器导出到本地系统。然后,如下所示使用它。

对于使用 PFX 文件的默认 SHA1,请执行以下操作:

signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /f "C:\mypfxfile.pfx" /p "MySecretPwd!" /v "c:\hgst.exe"

在上面:

  • 大多数选项与前面示例中解释的相同,但以下选项除外
  • /f - 这里的“f”代表文件。此选项仅支持 PFX 文件格式。
  • /p - 这里的“p”代表密码。此密码将用于打开给定的 PFX 文件。

要记住几点:

  • 如果您有非 PFX 格式的文件。例如 SPC 或 PVK 文件,那么您可以使用 pvk2pfx.exe 文件将它们转换为 PFX 文件格式并在上述命令中使用。
  • 此外,如果 PFX 文件中不包含私钥,则应使用 /csp 和 /k 选项分别指定 CSP 和私钥文件。

示例 4:使用 PFX 文件或 P12 文件的代码签名(对于 SHA256)

对于使用 PFX 文件的 SHA2,请执行以下操作:

signtool.exe sign /a /tr http://timestamp.geotrust.com/tsa /td sha256 /fd sha256 /v /f "C:\mypfxfile.pfx" /p "WrongPassword" /v "c:\hgst.exe"

如果提供的密码不正确,或者您没有为 PFX 文件指定 /p 选项,那么您将收到以下 SignTool 错误:指定的 PFX 密码不正确。

C:\> signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /f "C:\mypfxfile.pfx" /p "WrongPassword" /v "c:\hgst.exe"
SignTool Error: The specified PFX password is not correct.

C:\> signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll /f "C:\mypfxfile.pfx"  /v "c:\hgst.exe"
SignTool Error: The specified PFX password is not correct.

示例 5:其他 SignTool 选项

以下将使用与给定名称匹配的证书对给定文件进行签名:

signtool.exe sign /n "The tiamo" /v "c:\hgst.exe"

在上面:/n - 这里的“n”代表主题的名称。即主题名称。这应该与您商店中现有证书的确切主题名称匹配。○

下面的示例将对给定的 ActiveX 控件执行代码签名。当 Internet Explorer 提示用户安装此 ActiveX 时,这将显示给定的描述和 URL。这样,用户就知道这个 activeX 的全部内容了。

signtool.exe sign /f "C:\mypfxfile.pfx" /p "MySecretPwd!" /d "The tiamo" /du "https://www.hgst.com.cn/about" /v "c:\hgst.exe"

在上面的例子中:

  • 大多数选项与前面示例中解释的相同,但以下选项除外
  • /d - 这里的“d”代表描述。这是关于签名文件的简要说明。
  • /du - 这里的“du”代表描述网址。这会将给定的 URL 显示为签名内容的扩展描述。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。