签署Windows可执行文件

280
我有一个EXE文件,想要签名以便Windows不会警告最终用户关于来自“未知发布者”的应用程序。我不是Windows开发人员。所涉及的应用程序是从生成屏幕保护程序的应用程序生成的屏幕保护程序。因此,我对文件生成方式没有影响。
我已经发现,我需要从Verisign或instantssl.com等CA获得代码签名证书。我不明白的是,我需要做什么(如果可能的话)来签署我的EXE文件。简单的解释是什么?
Mel Green的回答让我更进一步,但signtool在任何情况下都希望我指定要使用的证书。我可以获得免费的代码签名证书来测试是否适用于我吗?
另外,请指定正确的证书类型。大多数网站只提到“代码签名”,并谈论由用户实际编译的应用程序的签名。这对我不适用。

11
只是好奇 - 购买证书需要支付多少钱? - Gabriel
10
大概每年大约400美元,可能不值得 :) - Sharan Arumugam
12
@SharanArumugam:什么????这就像微软反对便宜/免费的软件一样! - Gabriel
1
如何创建用于开发期间的临时证书: https://learn.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/how-to-create-temporary-certificates-for-use-during-development#installing-a-certificate-in-the-trusted-root-certification-authorities-store使用SignTool签署文件: https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/using-signtool-to-sign-a-file - RBT
这个回答解决了你的问题吗?如何在Windows上创建用于代码签名的自签名证书? - prosach
9个回答

171

如何签署您的应用程序

使用Microsoft SignTool为您的应用程序签名。

您可以在Windows SDK中下载它。请注意,也可以仅安装SignTool而无需安装整个SDK。安装后,您可以像这样从命令行使用SignTool:

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

这将会签署 MyFile.exe。以下是使用的命令行选项的解释:

  • /a 将自动使用最长时间内有效的证书,如果没有证书,SignTool 将显示一个错误。
  • /fd SHA256 将使用 SHA-256 摘要算法进行文件签名。建议使用 SHA256,因为它比默认的 SHA1 摘要算法更安全。
  • /tr http://timestamp.digicert.com 为您的签名应用程序添加时间戳。这非常重要,因为这将使签名保持有效,即使证书本身已经过期。 /tr 选项的参数是时间戳 URL。您可以使用此免费 RFC 3161 时间戳服务器列表中的任何时间戳 URL
  • /td SHA256 将使用 SHA-256 摘要算法进行时间戳签名。与之前一样,建议使用 SHA256,因为它更加安全。

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

如果您想获得一个证书来测试您签署可执行文件的过程,您可以使用MakeCert创建一个自签名证书。

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

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

即使您的应用已经签名,尝试运行该应用时,您可能仍然会看到以下警告消息:

Microsoft Defender SmartScreen 阻止了未识别的应用程序,以免运行此应用程序会使您的 PC 处于风险之中。

如何避免此警告是一个相当复杂的问题。请参阅此答案,了解有关这些 Microsoft SmartScreen 警告的全貌以及您可以做什么和应该了解什么。


2
一个独立的工作流程问题: https://dev59.com/WHVD5IYBdhLWcg3wHnsX - The_Ghost
4
这个工具会在安装Visual Studio时自动安装。要运行这个工具,请使用开发人员命令提示符(或者在Windows 7中使用Visual Studio命令提示符)。 - Westy92
非常好奇signtool使用的证书。 - Overdrivr
3
在Windows SDK 7.0之后,“signwizard”选项不再可用。 - Omar Reis
4
Makecert已被弃用,应使用PowerShell命令New-SelfSignedCertificate来创建测试证书。有关详情,请参见https://dev59.com/WHVD5IYBdhLWcg3wHnsX#51443366(The_Ghost提供的问题链接中的答案)。 - Alexander Revo
显示剩余4条评论

93

我在工作中遇到了同样的情况,以下是我们的发现:

首先,你需要获得证书并将其安装在电脑上。你可以从证书颁发机构(CA)购买一个证书或使用makecert生成一个证书。

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

购买证书

使用makecert生成证书

  • 优点:
    • 步骤简单,你可以将证书与最终用户共享。
  • 缺点:
    • 最终用户需要在其计算机上手动安装证书,这取决于你的客户,可能不是一个好的选择。
    • 使用makecert生成的证书通常用于开发和测试,而不是生产。

签名可执行文件

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

  • 使用计算机上安装的证书

    signtool.exe sign /a /s MY /sha1 sha1_thumbprint_value /t http://timestamp.verisign.com/scripts/timstamp.dll /v "C:\filename.dll"

    • 在这个例子中,我们使用存储在个人文件夹中的SHA1指纹(此指纹来自证书),对位于C:\filename.dll的文件进行签名。
  • 使用证书文件

    signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f "c:\path\to\mycert.pfx" /p pfxpassword "c:\path\to\file.exe"

    • 在这个例子中,我们使用密码为pfxpassword的证书c:\path\to\mycert.pfx来签名文件c:\path\to\file.exe

测试您的签名

  • 方法1:使用signtool

    转到:开始 > 运行
    键入CMD>单击确定
    在命令提示符下,进入signtool存在的目录
    运行以下命令:

    signtool.exe verify /pa /v "C:\filename.dll"

  • 方法2:使用Windows

    右键单击已签名的文件
    选择属性
    选择数码签名选项卡。签名将显示在签名列表部分。

希望本文能够帮助到您。

来源:


45

如果您从事开源开发,可以从Certum获得代码签名证书。我已经使用他们的证书一年多了,它确实可以消除Windows中的未知发布者消息。价格历史:

  • 2005 - €14.00
  • 2019 - €25.00
  • 2022 - €69.00

至于签署代码,我使用signtool.exe,像这样从脚本中运行:

signtool.exe sign /t http://timestamp.verisign.com/scripts/timstamp.dll /f "MyCert.pfx" /p MyPassword /d SignedFile.exe SignedFile.exe

1
你是正确的,它看起来不再是免费的了。就我个人而言,我刚刚续订,并没有支付任何费用。也许我享有特权。也许他们的内部流程出了问题。他们的网站肯定很复杂。 - Lee Richardson
4
Certum商店表示,他们的开源证书不会移除Microsoft SmartScreen过滤器消息。 - Markus Laire
1
@MarkusLaire 您可以通过购买昂贵的 EV 证书来绕过 SmartScreen,否则您的 EXE(以及您的证书)需要建立“声誉”,才能停止 SmartScreen 的标记。获得足够的用户数量 - 显然内部用户是可以的 - 将完成工作,但需要多少用户和多长时间似乎是不可预测的。 - Tim Pederick
@TimPederick 我的理解是个人无法获得 EV 证书,这些只有公司可以申请。 - Markus Laire
我的也是。我只是想指出,即使作为独立和/或开源开发者,你也可以通过SmartScreen获得你的软件...你只需要有一个愿意在一开始点击其警告的用户群(例如测试人员)。 - Tim Pederick
现在它的价格大约是每年69欧元,与常规代码签名证书的价格相当。 - TheLegendaryCopyCoder

19

这不是对问题的直接回答,但它与之密切相关(而且我希望它有用),因为早晚任何个人程序员都会掏钱购买证书。

所以,按价格排序列出了EV(扩展验证)代码签名证书的价格:

AboutSSL
240美元/年(点击诱导性价格)
287美元/年(优惠券后的实际价格)

KSoftware.net
1年350美元 + (50美元隐藏费用!)
2年600美元
3年750美元

OV:84美元每年(3年期)

我从他们那里购买了一个EV。几年后我又购买了一个OV。eToken被发送到一个USB驱动器上,不需要读卡器。他们只是中介。最终,您实际上是从Comodo(Sectigo)购买。

Sectigo非常慢。

第二次,验证花了整整两个月。电话验证多次失败。一切都很繁琐。技术支持并不知道发生了什么,可能只是在巴基斯坦的一个人通过一些脚本阅读。

Sklep.certum.pl
1年379欧元
(似乎仅适用于波兰用户)

LeaderSsl.de
1年364欧元或307欧元(含增值税19%)
(OV 69 +增值税)

Sectigo.com
1年499美元
3年897美元

GlobalSign.com
1年总费用为410美元
2年总费用760美元
3年总费用950美元

Digicert.com
1年:600美元(曾经是104美元)
3年:?

symantec.com
1年:700美元
3年:荒谬昂贵

更多价格在此处:
cheapsslsecurity.com CodeSigning EV
cheapsslsecurity.com SSL only!


EV vs OV

使用EV需要进行九个额外步骤,包括验证企业的公共电话号码、经营时间、注册号和管辖地,以及进行域欺诈检查、联系人黑名单检查和打电话验证请求者的就业状况。

有些人prompt $ echo off cls copy "my.exe" "my.bak.exe" "c:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" sign /fd SHA256 /f MyCertificate.pfx /p MyPassword My.exe pause

签署完我的EXE文件后会发生什么?

所以,花了一些钱之后,我终于签署了我的EXE文件。之后会发生什么呢? 没有任何变化...在Win10上我仍然看到同样的“不受信任”窗口,并且“不要运行”按钮。 “继续”按钮仍然是不可见的。我的程序每天大约有400次下载。让我们等待并观察需要多少次下载。


1
另请参阅:https://dev59.com/3b3pa4cB1Zd3GeqPfH3o - Gabriel
为什么OV没有太大帮助? - Bob
@Bob - 当你的应用程序使用OV签名时,Windows仍然会显示一些警告。 - Gabriel

18

8
四年后的附录:Comodo在2012年初遭受了攻击(http://blogs.comodo.com/it-security/data-security/the-recent-ra-compromise/),因此许多用户代理现在拒绝接受由Comodo根CA签发的证书。 - A. Wilson
8
2013年中期,使用Comodo仍存在风险。提到“用户代理”,指的是微软/Windows吗?毕竟,他们决定是否显示那个臭名昭著的“未知发布者”消息。 - Dan W
抱歉,已删除了显式的服务推荐,因为它们过时且现在已被判定为不属于讨论主题(原因是1.)。 - deceze

18

1
非常有帮助!该软件包在 Debian 中也可用,名称为 mono-devel - Marian
"osslsigncode是一个更好的选择:它基于OpenSSL和cURL,因此应该能够在大多数存在这些平台上编译。" - mozey

12

参考 https://steward-fu.github.io/website/driver/wdm/self_sign.htm

注意:来自微软 SDK 的 signtool.exe

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

    Makecert -r -pe -ss YourName YourName.cer
    
    certmgr.exe -add YourName.cer -s -r localMachine root
    
  2. 之后(将您的签名添加到应用程序中)

    signtool sign /s YourName YourApp.exe
    

makecert.exe 是来自 Windows SDK 的,对吧 @kyc1109?而且……如果我是在 Win7 下开发可执行程序,最好使用 Win7-SDK 中的 makecert.exe,而不是 Win10-SDK,我说得对吧? - gumuruh
嗨gumuruh, 你是对的,我想。但我还没有尝试过。 - kyc1109

7
请使用以下链接签署 .exe(安装程序 / 安装文件)文件(在不使用 Microsoft 设置 signtool 的情况下签署 exe / 设置文件)。

https://ebourg.github.io/jsign/#files

示例命令:

jsign --keystore keystore.jks --alias alias --storepass password MyInstaller.exe

对我有用 :)


请问您能否定义一下keystore.jks文件是什么,我们是从哪里开始制作它的?先做哪一个,等等...?@user2085962 - gumuruh
@gumuruh keystore.jks是一个Java密钥库文件,其中包含私钥和证书。Jsign还支持PKCS#12密钥库(又名.p12或.pfx)或纯PEM文件,以及用于EV证书的USB令牌。 - Emmanuel Bourg

7

osslsigncode 也可在 cygwin 下使用,因此如果您已经在使用它(就像我一样),那么您可以在当前环境中签名,而无需切换到 WSL。 - thoni56

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接