我有一个EXE文件,我想签名,这样Windows就不会警告终端用户来自“未知发行商”的应用程序。我不是Windows开发人员。所讨论的应用程序是由生成屏幕保护程序的应用程序生成的屏幕保护程序。因此,我对如何生成文件没有影响。

我已经发现我需要一个来自CA的代码签名证书,比如Verisign或instantssl.com。我不明白的是我需要做什么(如果可能的话)来签署我的EXE文件。一个简单的解释是什么?

Mel Green的回答让我更进一步,但signtool希望我指定在任何情况下使用什么证书。我能得到一个免费的代码签名证书来测试这是否对我有用吗?

另外,请指定哪种证书类型是正确的。大多数网站只提到“代码签名”,并谈论签名实际由用户编译的应用程序。对我来说不是这样。


当前回答

参考https://steward-fu.github.io/website/driver/wdm/self_sign.htm 注意:signtool.exe来自Microsoft SDK

1.第一次(制作私人证书)

Makecert -r -pe -ss YourName YourName.cer

certmgr.exe -添加你的名字。cer -s -r localroot

2.之后(添加你的签名到你的应用程序)

signtool sign /s YourName YourApp.exe

其他回答

如果您需要对Linux机器上的可执行文件进行签名,另一种选择是使用Mono项目工具中的signcode。Ubuntu支持。

如何为你的应用程序签名

使用微软的SignTool为你的应用签名。

你下载它作为Windows SDK的一部分。注意,也可以在不安装整个SDK的情况下安装SignTool。安装完成后,你可以从命令行使用SignTool,如下所示:

signtool sign /a /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 MyFile.exe

这将签署MyFile.exe。使用的命令行选项说明:

/a will automatically use the certificate that is valid for the longest time. If you have no certificate, SignTool will display an error. /fd SHA256 will use the SHA-256 digest algorithm for the file signature. Using SHA256 is recommended and considered to be more secure than the default SHA1 digest algorithm. /tr http://timestamp.digicert.com adds a timestamp to your signed apps. This is extremely important because this will allow the signature to remain valid even after the certificate itself has already expired. The argument for the /tr option is a timestamp URL. You can use any of the timestamp URL's from this list of free RFC 3161 timestamp servers. /td SHA256 will use the SHA-256 digest algorithm for the timestamp signature. As before, using SHA256 is recommended and considered to be more secure.

如何以及何时使用自签名证书

如果您希望获得一个证书,可以使用它来测试对可执行文件进行签名的过程,那么可以使用MakeCert来创建一个自签名证书。

一旦您创建了自己的证书并使用它对可执行文件进行签名,您需要手动将其添加为机器的可信根CA,以便UAC接受您的自签名证书作为可信源。请注意,您只能在自己的开发机器上执行此操作。通常不能在用户的计算机上这样做,因为大多数用户出于充分的理由不接受安装新的根CA。

如何摆脱“未识别的应用程序”警告

即使你的应用程序是签名的,当你试图运行应用程序时,你仍然可能会看到以下警告消息:

Microsoft Defender SmartScreen阻止无法识别的应用程序 开始。运行这个应用程序可能会使你的电脑处于危险之中。

如何避免这个警告是一个有点复杂的话题。请看这个答案,了解微软智能屏幕警告的全貌,以及你可以做什么,应该知道什么。

我在工作中遇到过同样的情况,下面是我们的发现

你要做的第一件事是获得证书并将其安装到你的计算机上,你可以从证书颁发机构购买一个证书,也可以使用makecert生成一个证书。

以下是这两种选择的优缺点

购买证书

优点 使用CA(证书颁发机构)颁发的证书将 确保Windows不会就应用程序向最终用户发出警告 来自使用证书的任何计算机上的“未知发行者” 来自CA (OS通常与manny的根证书一起提供 CA的) 缺点: 从CA获得证书涉及成本 价格详见https://cheapsslsecurity.com/sslproducts/codesigningcertificate.html和https://www.digicert.com/code-signing/

使用Makecert生成证书

优点: 步骤很简单,您可以与最终用户共享证书 缺点: 最终用户将不得不手动在他们的机器上安装证书,根据您的客户端,这可能不是一个选项 使用makecert生成的证书通常用于开发和测试,而不是生产

签署可执行文件

有两种方式签名你想要的文件:

Using a certificate installed on the computer signtool.exe sign /a /s MY /sha1 sha1_thumbprint_value /t http://timestamp.verisign.com/scripts/timstamp.dll /v "C:\filename.dll" In this example we are using a certificate stored on the Personal folder with a SHA1 thumbprint (This thumbprint comes from the certificate) to sign the file located at C:\filename.dll Using a certificate file signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f "c:\path\to\mycert.pfx" /p pfxpassword "c:\path\to\file.exe" In this example we are using the certificate c:\path\to\mycert.pfx with the password pfxpassword to sign the file c:\path\to\file.exe

测试你的签名

方法一:使用signtool工具 执行步骤:开始>运行 输入CMD >单击“确定” 在命令提示符下,输入存在signtool的目录 执行如下命令: signtool.exe校验/pa /v "C:\文件名.dll" 方法二:使用Windows 右键单击签名文件 选择属性 选择“数字签名”选项卡。签名将显示在“签名列表”部分。

我希望这能帮助到你

来源:

https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms537361 (v = vs.85) https://www.digicert.com/kb/code-signing/signcode-signtool-command-line.htm https://learn.microsoft.com/en-us/windows/win32/seccrypto/makecert https://cheapsslweb.com/comodo-code-signing

参考https://steward-fu.github.io/website/driver/wdm/self_sign.htm 注意:signtool.exe来自Microsoft SDK

1.第一次(制作私人证书)

Makecert -r -pe -ss YourName YourName.cer

certmgr.exe -添加你的名字。cer -s -r localroot

2.之后(添加你的签名到你的应用程序)

signtool sign /s YourName YourApp.exe

还有一种选择,如果你是在Windows 10上开发,但没有安装微软的signtool.exe,你可以在Windows上的Ubuntu上使用Bash来为你的应用签名。

https://blog.synapp.nz/2017/06/16/code-signing-a-windows-application-on-linux-on-windows/