Windows出现“Windows 已保护你的电脑”提示的原因

· · Windows, SmartScreen, 代码签名, 分发, MSIX, ClickOnce, Windows开发, 安全

SmartScreen、代码签名、EV/OV证书、MSIX/Store分发的实务整理

开发并分发Windows应用时,最先容易碰到的一道坎,就是这个警告。

Windows 已保护你的电脑
Microsoft Defender SmartScreen 已阻止启动无法识别的应用。

出现这个警告后,用户会感到不安。开发者也会困惑:“明明不是病毒,为什么会被拦截”“明明已经做了代码签名,为什么还会出现警告”。

本文将从代码签名、EV/OV证书、MSIX、Microsoft Store、ClickOnce、企业内部分发的角度,整理Windows应用分发时出现的SmartScreen警告。

1. 一句话总结本文

Windows应用分发中,代码签名是必需的。
但代码签名并不是能让SmartScreen警告必然消失的魔法

重要的是把三个观点分开来考虑。

观点 关注的问题
签名 文件是谁制作的,是否被篡改
信誉 该发行者或文件在Windows侧是否已被充分信任
分发渠道 从Store、Web、文件共享、Intune、GPO等哪个渠道分发

大致的判断标准如下。

情况 首先考虑的选项
面向普通用户大范围分发 首先考虑 Microsoft Store / MSIX
无法上架Store的商用应用 用OV证书或Azure Artifact Signing签名,并假定会出现初期警告
日本的开发者、法人 先确认Azure Artifact Signing的使用条件,若无法使用则OV证书是现实的选择
仅限企业内部分发 签名 + 证书分发 + Intune/GPO/App Control的运营设计
封闭网络、工厂、设备联动场景 事先固定签名、分发渠道、许可规则、更新流程
未签名EXE 原则上应避免
EV证书 仅以规避SmartScreen为目的购买的理由较弱

2. SmartScreen不只是“病毒判定”

出现SmartScreen警告时,用户往往会觉得“这是危险的应用吗”。

但SmartScreen并不是单纯地只看“是不是病毒”。根据 Microsoft 的说明,对于下载的文件,它主要参考以下这些信誉信息。

关注点 内容
发行者信誉 该签名者、证书、发行者是否被信任
文件哈希信誉 该具体文件是否已被充分分发并正常使用
是否有签名 是否具有有效的代码签名
分发渠道 经由Store、Web下载,还是企业内部分发
管理策略 是否由企业的Intune、GPO、App Control等进行控制

这里重要的一点是,新创建的文件还没有信誉

对开发者自己而言这是正确无误的应用,但从Windows侧看,它是“第一次见到的文件”。即使已经签名,只要文件哈希或发行者的信誉尚不充分,SmartScreen警告仍可能出现。

也就是说,可以这样理解SmartScreen警告:

并不意味着被断定为恶意软件。
但确实意味着Windows尚未判断其足够可信。

如果不理解这个差异,就容易产生“已经签名了却还不好”“买了EV证书却没有变化”这类误解。

3. 代码签名到底保证了什么

代码签名所保证的,主要是两点。

  1. 该文件确实由所显示的发行者签名
  2. 签名之后文件未被篡改

反过来说,以下这些事情并不由代码签名直接保证。

  • 该应用绝对安全
  • 该应用没有bug
  • SmartScreen警告不会出现
  • 企业策略必然会放行

尽管如此,代码签名仍几乎是必需的。

如果没有签名,用户无法得知发行者。在企业环境中,未签名文件可能会被 App Control、EDR、Defender、代理服务器、邮件网关拦截。制作自动更新程序时,签名对于验证更新文件是否为正版也十分重要。

也就是说,代码签名不仅是为了“消除警告”,而是分发、更新、审计、企业采用的基础

4. “买了EV证书从第一次起就不会出现警告”是过时的理解

以前普遍存在一种理解,认为使用EV代码签名证书,会在SmartScreen方面获得更有利的对待。

但现在,至少仅以规避SmartScreen为目的购买EV证书是危险的判断。根据 Microsoft 目前的说明,EV证书自动规避首次下载时SmartScreen警告的行为已经不复存在。用EV签名的文件,也需要像OV证书一样,以信誉逐步积累为前提来考虑。

EV证书并非完全没有意义。

  • 企业采购上,更严格的身份核实会被评价
  • 客户的安全审查中被要求使用EV
  • 已经持有EV证书,因此继续使用

如果有这些理由,使用EV证书是可以的。

但不建议仅以这个目的购买EV证书。

为了从第一次起就消除SmartScreen警告而购买EV证书

如果目的仅在于此,应先重新审视分发渠道、签名方式、对初期用户的说明、更新频率,以及是否能通过Store分发。

5. 签名方式的选择

整理一下Windows应用分发中常见的签名、分发选项。

选项 适合的情形 SmartScreen方面的考虑
Microsoft Store(MSIX) 面向普通用户、新应用、标准分发 由Store一侧重新签名,最容易保持稳定
Microsoft Store(MSI/EXE) 将已有Win32应用上架Store 安装程序本身仍需签名。经由Store的引导体验有优势
Azure Artifact Signing Store外分发、CI/CD集成、云端签名 信誉为累积式。需留意可用地区
OV代码签名证书 Store外分发、商用应用、日本国内开发者 传统且现实。应预计会出现初期警告
EV代码签名证书 采购要求或企业内部规定所需 不应以立即规避SmartScreen为目的选择
自签名证书 开发、验证、受管理的企业内部环境 不适合公开分发。需要分发受信任的根证书
未签名 原则上不建议 公开分发中应避免

Microsoft Store / MSIX

如果要面向普通用户分发,首先值得考虑的是 Microsoft Store。

特别是MSIX与Store分发的组合,在证书管理和SmartScreen警告方面具有优势。提交到Store的MSIX包会由Microsoft重新签名,因此开发者单独购买、更新证书的负担也会减少。

不过,并非所有Windows应用都适合MSIX。

  • 深度使用Windows服务
  • 需要驱动程序
  • 存在shell extension
  • 存在旧的COM注册或ActiveX资产
  • 安装时需要复杂的系统更改

在这些情况下,MSI或传统安装程序有时比MSIX更自然。

Azure Artifact Signing

Azure Artifact Signing 是 Microsoft 提供的云端代码签名服务,以前称为 Trusted Signing。

不需要使用实体USB令牌,容易集成到CI/CD中,这是其魅力所在。作为Store外分发的签名方式很有力,但存在可用地区和账户条件的限制。

根据2026年时点的Microsoft资料,组织用户面向美国、加拿大、欧盟、英国,个人开发者面向美国、加拿大。如果是日本的法人或个人使用,请务必确认使用条件。如果无法使用,传统的OV代码签名证书是现实的候选方案。

此外,即使用Azure Artifact Signing签名,SmartScreen的信任也不会立即授予。与OV证书一样,信誉会随着分发实绩逐步积累。

OV代码签名证书

对于日本的开发者或法人在Store外分发Windows应用,OV代码签名证书如今仍是现实的选择。

使用OV证书后,用户会看到发行者名称。相比未签名,这明显是更好的状态。不过,对于新应用或新文件,仍可能出现SmartScreen警告。

使用OV证书时,需要注意以下几点。

  • 持续使用同一个发行者名称
  • 每次都以同一发行者身份签名
  • 签名后不改动文件
  • 添加时间戳
  • 不只EXE,还要检查DLL、MSI、updater
  • 准备证书更新时的迁移计划

自签名证书

自签名证书对开发和验证很方便。

但在公开分发中基本无法使用。因为从用户的Windows看,该证书并非受信任的证书。

自签名证书适用于以下环境。

  • 开发者的本地PC
  • 测试者的验证环境
  • 可通过Intune或GPO分发受信任证书的企业内部终端
  • 能够完全管理终端配置的封闭环境

即使使用自签名证书,也需要管理“何时删除”“谁将其加入受信任列表”“是否混入生产环境”这些问题。

6. 实务中应该对什么签名

“只对EXE签名就结束了”是不够的。

Windows应用分发时,需要逐一确认签名对象。

对象 注意点
应用本体EXE 至少要签名
DLL 也要检查自研DLL、插件、helper DLL
安装程序EXE 因为用户最先运行,所以很重要
MSI MSI本身也要签名
MSIX 确认包签名与Publisher是否一致
updater 因具有权限,尤其重要
更新用metadata 自研updater要使用带签名的metadata
驱动程序 有另外的签名要求,通常与普通应用分开考虑

使用SignTool时,在目前的Windows SDK中,/fd/td的指定很重要。典型做法是指定SHA256。

signtool sign /fd SHA256 /tr <timestamp-server-url> /td SHA256 /a .\MyApp.exe
signtool verify /pa /v .\MyApp.exe

关键在于对最终成果物签名

如果在签名之后改写EXE、替换ZIP内的文件、在安装程序制作之后更改内嵌文件,签名可能会被破坏,或导致验证结果与预期不同。

在构建流水线中,需要固定这个顺序。

构建
  ↓
收集依赖文件
  ↓
制作安装程序 / 打包
  ↓
签名
  ↓
签名验证
  ↓
记录哈希
  ↓
分发

7. 各分发方式的思路

MSI / EXE安装程序

以MSI或EXE安装程序分发时,必须对用户最先运行的文件签名。

此外,安装后部署的EXE和DLL也应重新纳入签名对象来审视。即使只有安装程序签名,如果部署后的updater或helper未签名,在企业环境中可能会被拦截。

要考虑的事情大致是固定的。

  • 对安装程序本体签名
  • 对内含的EXE/DLL也签名
  • 分离出需要UAC提升的处理
  • 将updater或service helper作为单独对象进行审计
  • 稳定下载页面的URL
  • 向初期用户告知发行者名称

MSIX

MSIX是包一致性较强的方式。

如果能通过Store分发,在SmartScreen警告和证书管理方面会相当好处理。而在企业内部侧载或Store外分发时,需要认真设计MSIX包的签名与证书信任。

列出一些注意点。

  • 开发、验证阶段可以用自签名
  • 生产分发要用公开受信任的签名方式
  • 使appxmanifest中的Publisher与证书的Subject一致
  • 在Store外分发时,要假定可能出现SmartScreen警告
  • 事先确认是否存在不适合MSIX的OS集成

ClickOnce

ClickOnce对于向普通用户分发WinForms/WPF等.NET业务应用很方便。

不过,并不是因为使用了ClickOnce,SmartScreen问题就会消失。用户下载并启动的路径、清单签名、分发渠道、更新时的文件变化,都与此相关。

ClickOnce需要确认以下这些方面。

  • 应用程序清单与部署清单的签名
  • 分发源URL或共享文件夹的管理
  • 更新时证书变更的处理方式
  • 是否会被企业内部代理或Defender拦截
  • 首次安装时对用户的说明

ClickOnce的优势在于“容易分发”,但如果不把发行者信任和分发渠道也一并纳入设计,在实际现场仍会被拦截。

xcopy / ZIP分发

只放一个文件夹、只解压一个ZIP,这种分发方式很简单。

在封闭网络或企业内部工具中,这种方式有时是有效的。但对于面向普通用户的Web分发,这也是最容易受到SmartScreen、Defender、Mark of the Web影响的方式。

如果要采用xcopy分发,以下这些要点需要坚持。

  • 对EXE/DLL签名
  • 不只依赖ZIP,也要验证内部文件
  • 固定分发渠道
  • 明确标注版本、哈希、更新历史
  • 若后续追加自动更新功能,要加入签名验证

不应认为“不制作安装程序所以简单”,而应认为“要由自己承担安装程序原本承担的责任”。

自研updater

自研updater很方便,但它本身就是一个安全边界。

updater会获取新文件并替换现有文件,某些情况下还以管理员权限运行。这里出问题,比应用本体更危险。

至少要确认以下这些。

  • 对更新metadata签名
  • metadata中包含version、hash、size、channel、expiry
  • 下载后验证hash与签名
  • 验证失败时以fail-closed方式停止
  • 准备rollback步骤
  • 决定updater自身的更新方式
  • 将生产签名密钥与开发环境分离

这个主题,与既有文章《自动更新的安全设计》一起考虑会更容易理解。

8. 企业内部分发只看SmartScreen是不够的

对企业内部应用,常见一种误解。

因为只在企业内部使用,所以不需要签名

这是危险的想法。

在企业内部环境中,不仅是SmartScreen,还有多个机制会牵涉进来。

机制 发生的事情
Microsoft Defender 检查、隔离文件
SmartScreen 对未知的下载或执行进行警告、拦截
Intune 进行应用分发、证书分发、策略应用
Group Policy 分发受信任证书或执行控制
App Control for Business / WDAC 拦截未被许可的应用
EDR产品 监控行为或分发渠道
代理 / SWG 有时会直接拦截下载本身

特别是在使用App Control for Business的环境中,不仅“是否已签名”,“该发行者是否被允许”“是否经由managed installer”“哈希或路径是否被允许”都会成为问题。

Microsoft的部署指南也指出,App Control的策略变更应先以审核模式部署,确认拦截事件是否符合预期后,再逐步扩展到强制模式。

企业内部分发时,按以下顺序设计比较现实。

1. 划分目标终端
   - 开发者
   - 测试者
   - 部分部门
   - 全公司

2. 决定分发渠道
   - Intune
   - GPO + 文件共享
   - 企业内部门户
   - VDI / RemoteApp
   - 封闭网络的手动分发

3. 决定信任规则
   - 发行者规则
   - 证书分发
   - managed installer
   - 哈希许可
   - 路径许可

4. 用审核模式确认
   - 什么会被拦截
   - 有哪些DLL或helper被遗漏
   - 更新时是否会被当作不同文件处理

5. 分阶段展开
   - 小范围分发
   - 查看日志
   - 调整许可规则
   - 扩大范围

企业内部分发的要点不是规避SmartScreen,而是让分发渠道对Windows而言可以被解释、被说明

9. 常见的误解与正确的思路

误解 正确的思路
只要代码签名了,警告就一定会消失 即使签名了,信誉不足时警告仍会出现
EV证书从第一次起就安全 现在不应以立即规避SmartScreen为目的选择EV
自签名反正也是签名,所以没问题 在公开分发中基本不被信任
用ZIP分发就能避开警告 下载源、Mark of the Web、可执行文件的信誉依然存在
HTTPS就安全 HTTPS保护的是通信渠道,与发行者及可执行文件的信誉是两件事
企业内部应用所以不需要签名 在App Control、Defender、EDR中反而更容易出问题
只要安装程序签名就够了 部署后的EXE、DLL、updater也需要检查
提交申请就能更快提升信誉 面向普通用户的SmartScreen信誉基本上是靠分发实绩逐步积累的

10. 发布初期该如何向用户说明

新应用在最初几周或初期用户阶段,可能会出现SmartScreen警告。

此时,仅告知用户“即使出现警告也请执行”并不合适。安全的说明应包含需要确认的信息。

列举应纳入说明中的项目。

  • 正式的下载URL
  • 显示的发行者名称
  • 文件名
  • 版本号
  • 发布日期
  • 必要时的SHA-256哈希
  • 确认已签名的方法
  • 不执行来自不明渠道获取的文件

例如,面向企业内部用户,以下这样的说明是安全的。

本应用仅通过企业内部门户以下页面进行分发。
请确认显示的发行者名称为“○○股份有限公司”。
请不要执行通过邮件附件或聊天工具转发的EXE文件。
如出现SmartScreen警告,请将截图共享给信息系统部门。

面向普通用户时,应优先考虑通过Microsoft Store分发,或在下载页面上加入发行者确认说明。

11. 判断流程

在决定分发方式时,按以下顺序思考会更容易做出判断。

否,面向企业内部有Intune/GPO无管理分发Windows应用是否面向普通用户能否上架Microsoft Store优先选择Store / MSIX使用OV证书或Artifact Signing签名是否有终端管理签名 + 证书分发 + App Control审核固定分发源 + 签名 + 用户说明预计会出现初期SmartScreen警告从审核模式开始分阶段展开

实务上的第一候选可以这样整理。

条件 第一候选
面向普通用户的新Windows应用 Microsoft Store / MSIX
将已有Win32应用面向普通用户分发 Store的MSI/EXE渠道,或OV签名 + 自主分发
.NET企业内部应用 ClickOnce或MSIX,若有终端管理也可考虑Intune
需要服务或COM注册 偏向以MSI设计
只放置文件即可使用的诊断工具 已签名EXE + 固定分发源 + 版本管理
需要自研updater 先设计带签名的metadata与密钥管理

12. 最低限度的检查清单

发布、分发Windows应用之前的检查项目。

签名

  • EXE已签名
  • DLL已签名
  • MSI或安装程序EXE已签名
  • updater已签名
  • 已添加时间戳
  • 签名后未改写文件
  • 已用signtool verify验证

分发

  • 已确定正式的分发URL
  • 下载页面已显示发行者名称
  • 已显示版本号与发布日期
  • 已预计可能出现初期SmartScreen警告
  • 已考虑是否能上架Microsoft Store
  • Store外分发时,已考虑OV证书或Artifact Signing

更新

  • 更新文件也已签名
  • 自研updater已对metadata签名
  • 已验证hash、size、version
  • 失败时以fail-closed方式停止
  • 有rollback步骤

企业内部分发

  • 已确认Intune / GPO / App Control的有无
  • 已决定证书分发方法
  • 已用审核模式查看拦截事件
  • 已按目标部门分阶段展开
  • 已确认更新时不会再次被拦截

13. 结语

Windows应用不是做完就结束,分发的文件需要从Windows、用户、企业策略的角度来看都处于“可被信任的形态”。

需要把握的要点大致如下。

  • SmartScreen关注的是文件与发行者的信誉
  • 代码签名是必需的,但不能保证警告为零
  • EV证书不应以立即规避SmartScreen为目的选择
  • 面向普通用户分发时,优先考虑Microsoft Store / MSIX
  • Store外分发时,使用OV证书或Artifact Signing,并预计会出现初期警告
  • 企业内部分发不仅要看SmartScreen,还要看Intune、GPO、App Control
  • updater不是单纯的分发功能,而应作为产品的安全边界来设计

用一句话总结,就是:

Windows应用的分发,不是“如何放置”,而是“如何让Windows信任”的设计问题。

相关阅读

参考链接

共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。

常见问题

汇总了咨询这一主题时常见的问题。

为什么会出现“Windows 已保护你的电脑”这个警告?
这是因为 Microsoft Defender SmartScreen 判断该文件尚未获得足够的信任。SmartScreen 并不是单纯地判定病毒,而是综合考察发行者的信誉、文件哈希的信誉、是否有签名、分发渠道等因素。新创建的文件对 Windows 来说是“第一次见到的文件”,即使已经签名,在信誉尚未积累起来之前也可能出现警告。这并不意味着该文件被断定为恶意软件,但确实意味着 Windows 尚未判断其足够可信。
代码签名之后,SmartScreen警告就会消失吗?
并不一定会消失。代码签名能够保证的只有两点:该文件确实由所显示的发行者签名,以及签名之后文件未被篡改,并不能保证警告数为零。即使已经签名,只要文件或发行者的信誉尚不充分,警告仍可能出现。尽管如此,代码签名仍几乎是分发、更新、审计、企业采用的基础,几乎是必需项。如果没有签名,在企业环境中,文件可能会被 App Control、EDR、Defender 等拦截。
购买EV证书,是否从第一次下载起就不会出现SmartScreen警告?
这是过时的理解。根据 Microsoft 目前的说明,EV 证书自动规避首次下载时 SmartScreen 警告的行为已经不复存在,用 EV 签名的文件也需要像 OV 证书一样,以信誉逐步积累为前提来考虑。如果因为企业采购要求或客户的安全审查而被要求使用 EV,使用它是有意义的,但不建议仅以规避 SmartScreen 为目的购买 EV 证书。如果目的仅在于此,应先重新审视分发渠道、签名方式,以及能否通过 Store 分发。
要减少SmartScreen警告,应该如何分发?
如果要面向普通用户大范围分发,首先应考虑 Microsoft Store / MSIX。提交到 Store 的 MSIX 包会由 Microsoft 重新签名,因此在 SmartScreen 方面是最容易保持稳定的途径。如果无法通过 Store 分发,则应使用 OV 证书或 Azure Artifact Signing 进行签名,并假定初期仍可能出现警告,同时向用户提供正式的下载 URL、发行者名称、版本、哈希等信息。企业内部分发时,除了签名之外,还需要设计包含 Intune / GPO / App Control 的整体分发路径。

作者简介

本文作者的个人简介页面。

Go Komura

小村软件有限公司 代表

以 Windows 软件开发、技术咨询与故障排查为中心,擅长难以复现的故障调查,以及既有资产仍在运行的项目。

返回博客列表