除了Smartscreen证书,使用代码签名EV证书的优势是什么?

22

我需要购买一个代码签名证书,用于签署Win32应用程序,我在考虑是否选择EV证书。

我找到的EV证书的优点如下:

  1. 立即建立Smartscreen声誉(而不是等待3k下载? [来源]

  2. 在证书更新期间维护Smartscreen声誉[来源](如果第1个点无论如何都适用,则可能是一个无关紧要的问题)

  3. 提供硬件令牌交付的选项,通常普通证书不支持

我想知道它们是否带来其他优点,例如使用它们签署的应用程序是否比使用非-EV证书签署的应用程序更受到杀毒软件、防火墙和其他安全应用程序的信任(它们被屏蔽得更少,产生更多有利的警告等)。

我再次强调我最感兴趣的情况:您是否知道某些特定杀毒软件/防火墙/安全应用程序对使用EV证书签名的应用程序和使用标准证书签名的应用程序的处理方式存在差异?

2个回答

6

声明: 我是一家杀毒软件供应商的员工。

我想知道EV证书是否带来其他优势,例如,与非EV证书签名的应用程序相比,这些应用程序是否更受杀毒软件、防火墙和其他安全应用程序的信任。

这取决于制作安全应用程序的供应商或他们当前(*)的政策。我曾经为两个安全供应商工作过,他们在扫描恶意软件时忽略了证书的存在。原因如下:

  • 仅仅因为代码已被签名并不意味着它不是恶意的。它只意味着在签名之后没有被修改。例如,相当多的广告软件都已经被签名。

  • 恶意软件作者过去曾使用盗窃的证书,因此我们无法确切地确定它是否由原始作者使用。这就是为什么我在上面提到“当前政策”的原因,因为这可能会在一夜之间改变。

  • 验证证书是一个复杂而相对缓慢的过程,需要从磁盘读取整个文件——对于非SSD存储来说是一项昂贵的操作。它还需要执行一些CPU密集型的公钥加密操作。因此,对于某些大型可执行文件,检查证书可能比扫描恶意软件的文件更耗时。

由于我们通常根本不查看证书,因此无论是标准证书还是EV证书都没有关系。


1
是的,几乎没有任何好处。 - George Y.
这非常尴尬。我不知何故错过了这个问题,然后完全忘记了它。
我记得我们之前的聊天,那时可能发生了一些事情,导致我无法访问stackoverflow好几天。
我深表歉意。
好在还不到一年 :/ 。
- gbr
非常感谢您的贡献。听到您所工作的供应商至少忽略了证书,这令人非常感兴趣。 - gbr
虽然每次检查可执行文件时不查看证书是可以理解的,但对于被检测为危险的少数文件来说,这似乎是完全可行的。当然,签名并不能保证文件的安全性,但它是一个提示,当你不确定文件是否为恶意软件时,可以给予文件更多的信任(例如通过显示较少警告)。因此,除了 EV 方面之外,如果甚至普通证书真的没有被任何安全供应商用于任何事情,我会感到惊讶。 - gbr
是的和不是。截至2021年,一些供应商现在检查代码签名证书,例如检测已知的广告软件或PUA。它们很少这样做来将已知的良好应用程序列入白名单(由于存在太多证书)。然而,据我所知,没有任何供应商因为证书是EV而给予额外权重。请注意,对于大型黑客组,更不用说国家级行动者,即使获得EV证书也是非常容易的事情。 - George Y.
显示剩余3条评论

0

我和@George Y有不同的经验。我们从Sectigo获得的代码签名EV证书确实帮助避免了在Norton 360中出现的误报。至于其他杀毒软件,需要进行测试。

注:
我的经验与@George Y不同,并不意味着他是错的。这种差异可能是由于许多因素造成的,例如杀毒软件公司的政策等等。
此外,我的经验是基于我今天从代码签名中获得的积极结果。未来的更多测试(以及我们用户的经验)将证明这些积极结果是暂时的还是永久的。

1. 在代码签名之前

在代码签名之前,我们的用户会收到如下警告:

更糟糕的是,Norton 360会自动删除许多可执行文件和.pyd文件,从而完全破坏我们的软件。

这是一个彻底的灾难。

2. 签名后

今天,我第一次使用我们的新EV证书签署了我们的应用程序。我不仅签署了.exe文件,还签署了.dll.so.pyd文件。在签署这些文件时,我首先检查它们是否已经有签名,以避免重复签署我们构建中包含的第三方开源二进制文件的.dll文件。以下是我的Python脚本,自动化此过程:

import os, subprocess

# 'exefiles' is a Python list of filepaths
# to .exe, .dll, .so and .pyd files. Each
# filepath in this list is an absolute path
# with forward slashes.
quote = '"'
for f in exefiles:
    cmd = f"signtool verify /pa {quote}{f}{quote}"
    result = subprocess.run(
        cmd,
        stdin    = subprocess.DEVNULL,
        stdout   = subprocess.PIPE,
        stderr   = subprocess.PIPE,
        cwd      = os.getcwd(),
        encoding = 'utf-8',
    )
    if result.returncode:
        # Verification failed, so the file is not yet signed
        cmd = f"signtool sign /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /a {quote}{f}{quote}"
        result = subprocess.run(
            cmd,
            stdin    = subprocess.DEVNULL,
            stdout   = subprocess.PIPE,
            stderr   = subprocess.PIPE,
            cwd      = os.getcwd(),
            encoding = 'utf-8',
        )
        if result.returncode:
            # Code signing failed!
            print(f"Sign: '{f.split('/')[-1]}' failed")
        else:
            # Code signing succeeded
            print(f"Sign: '{f.split('/')[-1]}'")
    else:
        # Verification succeeded, so the file was already signed
        print(f"Already signed: '{f.split('/')[-1]}'")

目前为止,结果是令人兴奋的。Windows SmartScreen不再生成警告信息。Norton 360也没有了。我已经在我的笔记本电脑和安装了干净版Norton 360的台式机上尝试过 - 它们都信任这个应用程序(不像以前的代码签名)。

希望它能一直保持这种状态。我们也希望其他杀毒软件能够信任我们的应用程序。

注意:
截至撰写本文时,我们签署的应用程序仅供https://new.embeetle.com测试人员使用。
它很快也会在我们的公共网站https://embeetle.com上提供 - 但今天还未能提供。


正如我在帖子顶部所说的那样,这取决于软件供应商。您是否也尝试过非 EV 证书?供应商可能会对签名和非签名二进制文件进行不同的处理,并且对证书是否为 EV 不太关心。 - George Y.
@K.Mulier,为了明确一下,您的“1.在代码签名之前”这一步是指没有证书的exe文件,还是指具有标准(非EV)证书的exe文件? - emkey08
第一步是指一个没有任何证书的exe文件。对于造成的困惑,我们深感抱歉。 - K.Mulier

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