如何使SmartScreen过滤器信任自签名证书

43

Windows 8下的Microsoft SmartScreen Filter是小型开发者的噩梦。

虽然我知道它对终端用户有益,而且对于防止恶意程序安装在终端用户的计算机上也很有效,但我和很多其他开发者更不愿意支付年度更新代码签名证书或者更糟糕的EV代码签名证书的费用。此外,当为内部使用开发的产品使用信任的CA中的受信任证书进行签名并存储在Trusted Publishers存储区时,它们仍会成为过滤器过分行为的牺牲品。

以前,开发人员和管理员可以通过将发布者的代码签名证书安装在Trusted Publishers存储区中来禁用警告和提示。创造性的开发人员可以在使用付费Authenticode代码签名证书签名和时间戳预备条件时,将自签名代码签名证书安装在那里。之后,由发布者签名的程序将受到信任,并且不会触发SmartScreen Filter警报。基本上,一旦被信任,发布者就可以免除经常性的费用。

最近对SmartScreen Filter的更改(以及将其包含在Windows 8操作系统中作为“功能”)表明,Microsoft希望您购买代码签名证书,而不是创造性地解决他们为您创建的问题。有人发现了一种新方法来默认信任使用自签名代码签名证书的发布者吗(即不显示提示)?除了完全关闭过滤器之外,终端用户可以采取什么措施让SmartScreen Filter始终信任自签名证书?

请注意,购买代码签名证书不是这个问题的答案。我正在寻找一种方法告诉SmartScreen Filter信任那些没有从外部来源购买证书,而是为其组织内部使用颁发自己证书的发布者。

更新:我认为我可能找到了一个解决方法!MSDN可以得知,在Windows 8和Internet Explorer 10中,SmartScreen过滤器可以在被列为信任站点的站点上禁用。如果有人能验证这种方式是否适用于在Windows 8中从受信任站点下载并运行的安装程序,那将非常感激,并且这将帮助许多ISV和内部开发团队。这也将是回答此问题所需的解决方法。可以通过组策略来配置信任站点,因此从那里就很简单。

通过编程方式,可以通过将机器的HKLM \ Software \ Policies \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ Zones \ 2! 2301或用户的HKCU \ Software \ Policies \ Microsoft \ Windows \ CurrentVersion \ Internet 设置\区域\ 2!2301设置为0,以及按照此问题所示添加要信任的站点到信任站点区域来实现为信任站点区域关闭SmartScreen过滤器。

有人能否验证我的建议解决方法是否适用于在受信任站点中下载未签名或自签名的可执行文件在Windows 8上运行?我自己没有使用Windows 8,因为我的操作系统升级预算已花费在证书费用上。


1
也许这个页面可以为您提供一些有用的信息 http://msdn.microsoft.com/en-us/library/ie/jj542450(v=vs.85).aspx - Spadar Shut
浏览了一下链接,看起来可能会有用。谢谢你的引导。等我有更多时间研究你的链接后,我会更新这篇文章。 - Shannon Cook
Wizzard0,Windows 8系统广泛使用SmartScreen过滤器,导致“构建自己的”方法失败。自签名/私有CA颁发的证书对于大多数用途是可以接受的,但不适用于代码签名。我尝试使用从安装在最终用户计算机上的自定义根中颁发的代码签名证书,但过滤器仍然会弹出警告,并且证书根本没有获得“声誉”。这意味着警告是永久性的,据我所知无法规避。这似乎是一种旨在强制证书购买而不是保护免受恶意软件侵害的“功能”。 - Shannon Cook
我的意思是,当您实现自己的更新逻辑并清除已下载文件中的区域标识符时,那么 SmartScreen 过滤器就没有机会被调用。或者我对此有误? - wizzard0
将"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System"的REG_DWORD值EnableSmartScreen暂时设置为0可以禁用它,但这需要一个以管理员权限运行的预安装更新/下载程序。更改SmartScreen注册表设置可能也会使您的程序被SmartScreen标记为恶意软件。此外,更改此注册表条目需要注销并重新登录才能应用。 - Shannon Cook
显示剩余8条评论
5个回答

24
引用自MSDN网站
“SmartScreen强制开发者花钱购买证书”,这是反对者的说法。需要强调的是,EV代码签名证书不是与SmartScreen建立声誉所必需的,使用标准代码签名证书或未签名文件可以建立声誉,这一功能自IE9推出Application Reputation以来就一直存在。但是,EV代码签名证书的存在是一个强有力的指示,表明该文件是由经过严格验证过程并使用硬件签名的实体签署的,我们的系统能够更快地为该实体建立声誉。换句话说,EV(付费)验证只是决定是否显示SmartScreen警告的大算法中的一个因素。如果有很多人下载您的程序,或者如果您的程序下载链接已经很长时间没有更改,通过一些工作,您可以使您的程序显示警告。此外,通过数字签名代码,您可以提高应用程序信誉度。这是来自Microsoft有关此主题的页面的消息。

1
那并没有完全回答我的问题。我要求的是解决方法。你的回答比较政治化而不是技术性的。你能否编辑一下,加入一个解决方法或者删除它?另外,如果代码签名证书不是由Microsoft Trusted Root计划的成员颁发的,那么它们根本不会获得信誉,所以如果你没有这样的证书,最好不要签名(从信誉的角度来看)。奇怪的是,未签名的可执行文件确实会获得信誉。 - Shannon Cook
12
没有变通的方法,我提出了一些策略,可以用来提高声誉。当Windows 8首次推出时,作为一名业余开发者,我研究了三个小时。你可以使用这些策略来提高自己在该服务中的声誉,但微软不会提供任何变通方法。这是你能够得到的最接近的方法。 - William
1
那仍然是一个没有回答的答案。最好在发现解决方法之前不回答这个问题。当我发布这个问题时,我从这篇博客文章中得到了“没有解决方法”的答案。请删除你的回答。它是政治性的而不是技术性的,甚至没有试图回答这个问题。在可信发布者存储中安装可以解决除Windows 8以外的所有问题,而对于Windows 8,肯定会发现另一种解决方法。 - Shannon Cook
7
从技术上讲,答案就是对问题所作出的书面或口头回应。这是一个问题,对吧? :) 当你提出问题时,并不总能得到你希望得到的答案。William的回答确认了没有单一的解决办法。(例如:“只需做这件事,就可以解决你的问题。”)既然你知道了这一点,你(可能)会停止寻找其他答案。知道没有解决办法也是一种有价值的答案。 - Tyler Montney
2
我发现这个答案很有用,很高兴你没有删除它。 - Drew Noakes
显示剩余4条评论

5
使用微软提供的Windows 8 90天试用版,我已经验证了我的解决方法确实有效。如果您想仅支付一次代码签名证书而不是年费,那么这种方法也适用于您,但我不能做任何保证。我的解决方案是针对每台机器的,但应该很容易转换为每个用户适用。
以下是我的解决方案:
1. 建立自己的证书基础结构。 2. 将由您的根证书颁发的任何中间CA证书以及由中间CA颁发的任何代码签名证书发布到您的网站上作为.cer文件。 3. 在您的网站上安装由您的根CA颁发的SSL证书。 4. 创建一个安装程序/下载器应用程序,执行以下任务: 安装根证书(从您的网站,步骤2)到最终用户计算机的可信根证书颁发机构存储中。 通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2!2301设置为0,禁用可信站点互联网区域的SmartScreen过滤器。 通过添加注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\yourdomain.com\yoursubdomain,将您的网站添加到区域映射。 通过在先前步骤中创建的密钥中创建名为https的DWORD,将您的域映射到受信任的站点区域,并设置值为2。 5. 从Microsoft可信根程序的成员处购买代码签名证书,最好是EV证书。 在购买之前,请确保CA用于您的代码签名证书的证书和时间戳方案不会导致OID 1.3.6.1.4.1.311.10.3.13或1.3.6.1.4.1.311.10.3.14,因为这些会使签名在证书到期时过期,无论是否有时间戳。 6. 使用第5步购买的证书对下载器/安装程序进行签名和时间戳。验证签名上是否存在生命周期限制。如果一切正常,则可以将购买的代码签名证书放在安全的地方并锁定它。 7. 将下载器/安装程序发布到您的网站上。将其设置为所有产品的先决条件下载。 8. 从这个点开始,您可以使用您自己的内部证书颁发机构颁发的代码签名证书(以及其他证书),而不会受到SmartScreen过滤器的干扰。
到目前为止,我使用这种方法收到的最糟糕的警告是“This type of file could harm your computer.”(此类文件可能会损害您的计算机),这是典型的“您正在下载可执行文件!”警告。它不会隐藏运行选项,并且不会出现在使用单击“发布”中生成的引导网页进行ClickOnce部署的情况下。
感谢所有的评论和链接。

我没有点踩,但第四步听起来很奇怪。a)你会如何安装这个安装程序?(如何防止它被SmartScreen标记为不安全?)b)在未经用户许可的情况下调整用户注册表设置以进行SmartScreen过滤器似乎不是一个好主意。 - Marek
抱歉回复晚了,税季来了。A)第5步绕过了过滤器安装程序。B)对注册表的修改将在用户许可的情况下进行,因为当用户接受软件的最终用户许可协议时,就已经授予了权限。本质上,您正在设置应该最初设置的内容。如果用户选择信任发布者及其网站(即,在受信任存储中安装发布者的证书),则SmartScreen应该信任该发布者。 - Shannon Cook
7
第五步也需要“花费大量的钱”。 - Damian Yerrick
4
我会立刻卸载任何干扰我的系统安全设置的应用程序,并永远禁止该开发者的所有应用程序。 - Oliver Weichhold

3
我发现了一种非常简单的方式来绕过筛选器,即使没有管理员权限也可以。您需要做的是:
  1. 打开记事本
  2. 输入以下内容:@%*
  3. 将文件保存为"SkipSmartScreen.bat"(是的,带引号),与您的应用程序位于同一文件夹中。您可以稍后重命名批处理文件
  4. 要启动您的应用程序,请将exe拖放到批处理文件上
这将绕过智能屏幕筛选器。
在Windows 10 Home、Pro和Enterprise以及Windows 8 Pro上测试通过。
原理如下:
  • @ - 这只是为了好看,它隐藏了执行命令的名称
  • %* - 这会展开所有传递的命令行参数(例如,您在批处理文件中放置的文件)
  • 整个过程:它通过批处理文件执行文件,就像它是批处理文件中的一行一样。由于某种原因,Windows不会对从批处理文件中执行的文件进行任何检查。

1
这里有一个很好的解释,说明如何关闭SmartScreen:
- 在Windows 8中打开或关闭Windows SmartScreen
- 在文件夹选项中取消勾选选项
我用了第一个链接中的"选项一",并且它对我起作用了。
  1. 打开控制面板(图标视图),然后单击操作中心图标。
  2. 在操作中心的左窗格中,单击更改Windows智能屏幕设置链接。
  3. 如果收到UAC提示,则单击
  4. 选择您希望Windows智能屏幕如何处理未识别程序的选项,然后单击确定
    注意:默认选项是从互联网运行未识别应用程序之前获取管理员批准。
  5. 完成后,如果需要,可以关闭操作中心。

希望这正是您所寻找的。:)


好的,我得到了负数。有人能解释一下为什么吗? - Monic
1
你的回答是关于用户在他们的PC上关闭SmartScreen。问题是“作为应用程序开发人员,我如何防止用户甚至看到SmartScreen窗口?”显然这不是我们可以做到的(我们必须告诉用户禁用它,这可能会有安全隐患)。 - ashes999

1

虽然这是一个老问题,但我最近也遇到了同样的问题,需要将一个小型安装包下载到用户的电脑上供其执行。但像往常一样,SmartScreen阻止了下载...

我发现的一个解决方法是将安装程序文件打包成.zip(或类似格式),然后让用户下载这个压缩文件并在其中执行安装程序。至少在我的情况下,这是最“漂亮”的解决方案。

这种方法可以避免为您的文件分配任何证书。您只需要让用户信任您,但这将绕过SmartScreen筛选器。

希望这个方法能成为您问题的解决方法。


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