在 Windows 上弃用 SHA1 代码签名证书

信息安全 电子签名 sha256 代码签名
2021-09-07 10:58:25

编辑(2016 年 7 月 7 日)-见帖子末尾的补充

我一直在密切关注有关 Microsoft 反对对 Windows 可执行文件使用 SHA1 代码签名证书的问题(http://social.technet.microsoft.com/wiki/contents/articles/32288.windows-enforcement-of-验证码代码签名和时间戳记.aspx)。

我们现在进入 2016 年,由于我们很快需要签署和发布代码,我正在尝试验证,确实,如果不将我们的代码签名证书升级到 SHA256 证书,我们将会遇到问题。但是,我似乎无法证明任何预期的问题。

我已经使用 SHA1 证书签署了一些可执行文件(今天,在 2016 年),并将 AppLocker 配置为仅运行签名的可执行文件(我已经验证了这一点 - 我无法运行未签名的可执行文件)。但是,我仍然可以自由运行我新的 SHA1 签名的可执行文件,此外,从 IE 中的 Web 服务器下载这些文件不会向我显示任何“警告”(如我所料) - 安全扫描返回所有文件很好!

我在 Windows 7 上运行测试。

我应该期望遇到哪些实际问题?

(如果您想知道为什么我们不只是简单地升级到 SHA256 - 有多种原因:一个是官僚主义,但另一个是我们还签署了目前不支持双重签名的 VBS 脚本)。

编辑(2016 年 7 月 7 日) 好吧,微软似乎终于对 IE 和 Edge 进行了更新,如果您下载了仅使用 SHA-1 证书签名的可执行文件,则会向您发出警告!基本上,对于 IE 11.0.30或更高版本,如果您在2016 年1 月 1 日之后下载使用 SHA-1(但不是 SHA-256)证书签名的可执行文件,您将看到以下警告之一:

在此处输入图像描述 在此处输入图像描述

我猜微软终于开始发出警告,为 2017 年 1 月 1 日的截止日期做准备。重要的是要注意,目前,除了这些警告之外,没有其他更改 - 文件仍然可以正常执行,当然,在其他浏览器中下载它们不会导致问题。

4个回答

我现在找到了一个在 2016 年 1 月 1 日之后使用 SHA-1 证书签名的实际下载示例。我在 Windows 10 上使用 Edge 下载了 KeePass 2.31。

Edge 告诉我“此文件的签名已损坏或无效。”

下载使用 SHA-1 证书签名的文件

如果我右键单击并选择“仍然运行”,或者在 Windows 资源管理器中双击该文件,SmartScreen 会阻止该文件:

SmartScreen 阻止使用 SHA-1 证书签名的文件

勾选复选框并单击仍然运行允许文件正常运行。然后,UAC 警告会显示发布者的名称,就像使用正确签名的可执行文件一样。

当 SmartScreen 阻止文件时单击“仍然运行”会从文件中删除“Web 标记”。在 Windows 资源管理器中再次双击该文件不再阻止该文件。

Windows 资源管理器中的“数字签名详细信息”对话框也显示签名正常。即使文件仍然具有“网络标记”(即在使用 SmartScreen 过滤器中的“仍然运行”按钮之前),它也会执行此操作:

在此处输入图像描述

该文件实际上具有双重签名。第一个使用 SHA-1 作为签名,第二个使用 SHA-256 作为签名。但至关重要的是,两者都是使用 SHA-1 证书制作的。这就是 Windows 7 及更高版本在下载文件时发现的问题。此外,两个签名都带有 SHA-1 时间戳。从 2017 年 1 月 1 日开始,Windows 10 将出现下载文件的问题。

似乎“数字签名详细信息”对话框没有考虑文件是否具有“网络标记”。对于这个文件上的两个签名,它都说“这个数字签名没问题”。 因此,要真正测试您的文件是否正确签名,您需要像客户一样从您的网站下载它们。

在自 8 月以来未更新的原始 Windows 10 的虚拟机快照和自 11 月以来未更新的 1511 版本的另一个快照中测试相同的下载不会产生任何警告。如果我让 1511 VM 检查并安装更新,直到它说它是最新的,那么我确实会收到上面显示的警告。我在之前的回答中确实注意到 SHA-1 弃用是通过 Windows 更新推出的。所以看起来这是一个最近的更新,可能是 1/1/16 之后的更新。 在测试您的下载之前,请确保您的 PC 具有所有最新的安全更新。

这更像是一个扩展的评论/事实调查条目。本身并不是一个完全成熟的答案。

我也不明白。这很令人困惑。但我不明白这一点并不难过,因为埃里克·劳伦斯也对此感到困惑。他曾经是一名 Internet Explorer 开发人员,但现在在 Google Chrome 上工作。而且他知道如何处理证书。(所以如果他没有得到它,那么我倾向于说这真的很令人困惑。)(而且他也在 StackExchange 上。)

  1. 在这里查看他的评论:

    https://blogs.windows.com/msedgedev/2015/11/04/sha-1-deprecation-update/(存档在这里。)

    另外值得注意的是:这里的宝石:

    Eric Lawrence
    您链接的 KB 表示没有计划弃用基于 MD5 的 Authenticode 签名(代码上的哈希,而不是证书)。这似乎……不负责任。

    害怕。不幸的是,微软没有回复该评论。

  2. 他在 TechNet Wiki 站点上留下了另一条评论:http: //social.technet.microsoft.com/wiki/contents/articles/32288.windows-enforcement-of-authenticode-code-signing-and-timestamping.aspx(存档在这里。)

    EricLaw [ex-MSFT] 2015 年 11 月 4 日上午 9:23
    这段文字非常令人困惑:“代码签名文件哈希:微软不要求 CA 转而使用 SHA-2。Windows 也不会对这些证书强制执行策略。如果对 SHA1 的前映像攻击变得可行,我们将重新评估系统如何信任这些证书。”

    Authenticode 文件哈希不是由 CA 生成的,并且签名不是“证书”。

再说一遍:微软对此没有回答。他并不是唯一一个表达困惑的评论。

  1. 玩系统时钟?如果您想重现故障,您可以尝试TechNet Post 上列出的“Graham Bloice”步骤:

    在测试中,我们发现用于通过 IE 安装 ActiveX 组件的现有 SHA1 签名 cab 文件无法在弃用日期后立即安装(通过在注册表中调整日期)即使 cab 签名时间戳早于(移动)弃用日期。Win 10 没有失败,但 Win 7、Win 8.1、Server 2K12 和 Server 2K12 R2 在我们的测试中都失败了。

    这似乎与弃用通知不一致,即在弃用日期之前标记的签名将在 2020 年之前有效。

再说一遍:微软对此没有回答。

进一步阅读

您可以控制的带时间戳的 Authenticode 签名中有 3 个摘要。

  1. 您的证书摘要。最近购买的证书将使用 SHA-256。大多数 CA 在 2014 年转为颁发 SHA-256 证书。他们只在特殊要求时提供 SHA-1 证书。检查证书的一种快速方法是在资源管理器中右键单击您已使用它签名的 .exe,然后进入“数字签名”选项卡、“详细信息”按钮、“查看证书”按钮、“详细信息”选项卡。签名算法应该是“sha256”。Windows XP SP3 是支持 SHA-256 证书的最旧的 Windows 版本。您链接的文档中所述的政策是“Windows [7 及更高版本] 信任 SHA1(如果时间戳早于 2016 年 1 月 1 日)和 SHA-2(任何时间戳)用于 Web 文件的标记。”

  2. 签名本身的摘要。您可以在“数字签名”选项卡上检查现有签名。Windows 7 及更高版本直接显示摘要算法。在任何版本的 Windows 上,您都可以单击详细信息按钮、高级选项卡来检查摘要算法。使用 signtool.exe 时,可以使用/fd sha256参数将其设置为 SHA-256。Windows 7 是支持 SHA-256 签名的最旧版本的 Windows。为此,规定的政策是“在 SHA-1 原像可用之前不得更改”。甚至MD5 签名仍然被接受

  3. 时间戳的摘要。使用 signtool.exe 时,您需要将/tr参数与 RFC 3161 时间戳服务的 URL 一起使用并/td sha256请求 SHA-256。Windows 7 是支持 SHA-256 时间戳的最旧版本的 Windows。为此,规定的政策是“在 Win 10 及更高版本上,于 2017 年 1 月 1 日阻止 Web 文件的标记”。

总结是,如果您获得 SHA-256 证书,则 Windows XP SP3 目前通过 Windows 10 接受使用带有 SHA-1 时间戳的证书的单个 SHA-1 签名。在 2017 年 1 月 1 日,您将需要双重签名如果您想支持 Windows 10 以及 Vista 或 XP SP3。

折旧政策通过 Windows 更新应用于 Windows 7 及更高版本。如果禁用更新,则不会发生折旧。您应该体验到的是,Windows 7 将带有 SHA-1 证书的签名视为无效,这会在运行从 Internet 下载的文件时导致更严重的警告。

我也提供了一些额外的信息,因为我今天遇到了所有这些问题,这花了我半天时间。

我收到“此文件的签名已损坏或无效”。也来自 Edge。Windows 告诉我,我的文件(已使用 SHA256 签名)不安全,也未能向我显示正确的证书信息(仅限“未知发布者”)。

我们正在使用 StartSSL 代码签名证书,并在 12 月切换到新的 SHA256 证书。我们没有注意到的是,signtool 在签名过程中也包括所有中间(!)证书。结果是:它使用本地缓存的中间证书版本,尽管有更新的证书可用,但这些证书已经过时(仍然使用 SHA1)。删除和更新此证书后,一切都按预期工作。

因此,请务必检查链中的每个证书是否也是 SHA256,否则一切都会中断 - 因为中间体包含在签名过程中!

在此处输入图像描述