在 Windows 上安装 SignTool EXE以及代码签名示例
如果您的公司环境也有一些 Windows 服务器和应用程序,那么您最终可能会遇到必须对 Windows 文件进行数字签名的情况。
对 Windows 文件(如 EXE、DLL、OCX 或 CAB 文件)进行数字签名的过程称为代码签名。
为此,您应该从赛门铁克、Thawte 或 Godaddy 等受信任的提供商处购买代码签名证书。
购买代码签名证书后,您应该使用名为 signtool 的工具对文件进行签名。
本教程解释了以下内容:
- 如何在 Windows 10(和 Windows 7)中安装 SignTool
- 使用 SHA1 的默认代码符号示例
- 使用 SHA256 算法的代码签名
- 使用 PFX 文件或 P12 文件的代码签名(默认 SHA1)
- 使用 PFX 文件或 P12 文件的代码签名(对于 SHA256)
- 其他 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”:
- 下载“ Windows 10 SDK ”独立版并安装。(这是推荐选项)
- 下载“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 的摘要屏幕。
在安装 SDK 期间,我收到此警告消息:“某些 Windows SDK 组件需要 RTM .NET Framework 4。安装程序检测到 .NET Framework 4 的预发布版本。”
如果您没有安装 .NET 框架,或者没有最新的 .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 交换密钥。在以下对话框中单击确定。
最后,购买证书后,您可以从提供商处“领取”证书。在此过程中,它会再次询问您是否允许代表您执行数字证书操作。在此处单击“确定”。这将直接从提供程序下载证书到您的本地证书存储。
然后,从您的提供商处下载的证书将在 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”——这应该是最后一个参数,它是完整路径和您要进行代码签名的文件的名称。
在执行上述命令时,它可能会弹出以下窗口,说明它正在使用您的私钥对数据进行签名。在此处单击“确定”。
在此示例中,以下是上述命令的部分输出。这表明给定的 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 显示为签名内容的扩展描述。
- 点赞
- 收藏
- 关注作者
评论(0)