最近将一个 Golang 编译的执行文件放到他人机器上执行,但是 Microsoft Defender Antivirus 认为该执行文件含有木门病毒 - Trojan:Win32/Sabsik.TE.A!ml,结果不但不能运行还被自动删除😢。
那么对于这样的误报该如何处理?经过一番搜索后发现早就存在这样的误报问题,并且已经有人上报微软开发部门。不过时至今日似乎此问题依然存在。
对于这个问题最简单的处理方法是:在 Defender 里设置允许执行该文件。但是该方法对于普通用户来讲可能并不合理(用户为什么会完全信任你的软件呢)。所以还需要一个更合理的方案。
目前我所采用的解决方案是给执行文件进行数字签名,这样至少我的应用程序不会被删除。
给执行文件进行免费数字签名
签名工具需要安装 Windows SDK,当然也可以通过 Visual Studio Installer 来安装。
下面
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\
是 Windows SDK 的安装地址,需要替换成你的安装目录,这个目录里应该能够找到signtool.exe
文件。假设执行文件叫
myapp.exe
。
打开 CMD,执行如下命令:
第一步,设置PATH,方便后面执行签名程序:
SET PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\;%PATH%
第二步,制作签名文件(执行后会有弹框来设置一个签证密码,-n
表示发布者的证书的名称,-ss
表示将存储生成的证书的使用者证书存储的名称,更多详细的参数请参考这里):
makecert -n "CN=myapp.com,[email protected],C=China" -r myapp.cer -ss myapp.com -sv myapp.pvk -$ individual
第三步,接下来将签名文件.cer
转换成.spc
:
cert2spc myapp.cer myapp.spc
第四步,通过.spc
将.pvk
转换成.pfx
:
pvk2pfx -pvk myapp.pvk -spc myapp.spc -pfx myapp.pfx
最后,使用SignTool对执行文件myapp.exe
进行数字签名:
signtool sign /fd SHA256 /f myapp.pfx myapp.exe
至此,您的这个执行文件就不会被误报含病毒😄。因为已经制作好.pfx
文件,所以后续再签名仅执行最后一步即可。此方法主要是用于测试目的或开源项目,对于商业应用分发还是建议购买正版签名证书。
希望此方法对你也有帮助🤝。
(以下介绍取自微软官方介绍)
代码签名简介
软件行业必须为用户提供信任代码的方法,包括 Internet 上发布的代码。 许多网页仅包含可以下载且风险很小的静态信息。 但是,某些页面包含要下载和运行在用户计算机上的控件和应用程序。 这些可执行文件可能会有下载和运行的风险。
打包的软件使用品牌和受信任的销售网点来保证用户的完整性,但在 Internet 上传输代码时,这些保证不可用。 此外,Internet 本身无法保证软件创建者的身份。 它也不能保证任何下载的软件在创建后未更改。 浏览器可以显示一条警告消息,说明下载任何类型的数据可能存在的危险,但浏览器无法验证代码是否是它声称的。 必须采取更活跃的方法,使 Internet 成为分发软件的可靠媒体。
提供文件的真实性和 完整性 保证的一种方法是将 数字签名 附加到这些文件。 附加到文件的数字签名会积极标识该文件的分发服务器,并确保在创建签名后未更改文件的内容。