EV 代码签名存在问题

Posted

技术标签:

【中文标题】EV 代码签名存在问题【英文标题】:Having Issues With EV Code Signing 【发布时间】:2017-01-08 07:17:46 【问题描述】:

我最近从 DigiCert 购买了 EV 代码签名证书...

现在我在签署我的安装程序可执行文件时遇到问题。

目前(到现在)以下是制作安装程序的过程:

第 1 步:

我的安装程序是这样配置的,它会从它的子支持目录加载所有常用文件。

如下文件结构:

Setup.exe(它只有应用程序的exe文件和一些不时更改的配置文件)

支持(目录)

Support\DLL(具有我的应用程序所需的 DLL 文件)

Support\Others(任何其他文件)

支持\ETC(仅用于示例目的)

所有这些支持文件都驻留在我的服务器上,因为它们不会经常更改

所以,我创建了一个包装器 installer.exe 文件和一个脚本来处理包装器..

包装器 installer.exe 文件也驻留在我的服务器上

第 2 步:

我的脚本执行以下步骤:

a) 使用更新的应用程序文件制作 setup.exe。

b) 上传 setup.exe 文件到服务器

c) 在包装器 installer.exe 文件的末尾添加(附加)该 setup.exe 和所有其他所需文件

d) 我向我的客户/用户提供该包装器 installer.exe(单个文件)。

第三步:

当该包装器执行时,它会在临时目录中创建一个临时文件夹。提取所有本身附加的文件。并从该临时目录运行 setup.exe

我做这个过程,因为我只需要更改只有几千字节的应用程序文件(总是低于 1mb),但这些支持文件的大小很大。

因此,不必每次都从本地计算机上传所有这些文件。

我制作了这个包装过程以使更新/上传过程更快。

现在,问题来了:

如果我签署 wrapper.exe 文件并将其放入服务器,但是当我的脚本将数据附加到该文件时,它会丢失证书设置(它不再签名:()

那么,我该如何克服这种情况..

更新 1:

根据要求,下面是用于附加 setup.exe 文件的 php 代码:

    //Appending Setup.exe file...
    $archive_File = 'files/' . $strFileID . '.exe';
    if (is_file($archive_File) == 1)
    
        $strSize = filesize($archive_File);
        $strData = 'Setup.exe' . chr(0) . $strSize . chr(0) . file_get_contents($archive_File) ;
        file_put_contents($strArchiveFile, $strData, FILE_APPEND | LOCK_EX);
    
    else
    
        exit ('following file does not exits: ' . $archive_File);
    

最好的问候

【问题讨论】:

您需要显示一些代码,说明您如何通过包装器附加和提取这些设置文件。您应该指向一个可公开访问的 wrapper.exe 版本。 签名嵌入在文件本身中。除非存在某些损坏或您的脚本附加了未签名的文件版本,否则它们不会丢失签名。 @selbie,先生,请检查我已添加示例/部分代码.. 最好的问候 您是否验证了您最初签名的 setup.exe 的哈希与您提取的 setup.exe 文件的哈希匹配?如果您没有 md5 或 sha 哈希工具可从命令行运行,请下载 fciv。 @selbie,先生,我不关心 setup.exe 文件,我关心 wrapper (installer.exe) 文件.. 因为这是用户将运行的文件..跨度> 【参考方案1】:

在您对 wrapper.exe 进行代码签名后,您将无法对其进行修改。这就是代码签名的全部意义 - 验证签名的可执行文件上没有发生病毒或其他篡改。

我不确定您为什么要先对 wrapper.exe 进行代码签名,然后再将文件附加到它。您需要执行以下步骤:

    首先对 setup.exe 和所有其他二进制文件进行代码签名,除了 wrapper.exe

    将 setup.exe 和所有其他文件附加到 wrapper.exe。

    然后在 wrapper.exe 完全构建后对其进行代码签名。

有很多免费工具可以生成自解压存档,运行时会提示用户在其中运行 setup.exe。 7Zip will do this for free.

但听起来您需要在下载之前按需构建您的 wrapper.exe。如果是这种情况,请将代码签名脚本添加到构建最终 wrapper.exe 的服务器代码中

【讨论】:

非常感谢您的回答先生,让我再澄清一下。我知道那是,但问题是,例如,现在我做了所有这些,我的 wrapper.exe 大小为 50MB+,我将它上传到我的网站/服务器。几天后,我更新了我的 exe(man 应用程序文件),我必须再次处理所有文件并上传文件大小为 50MB+ 而应用程序 exe 文件小于 1mb 的包装 exe。目前我只需要上传 setup.exe 文件,其余部分在我的服务器中完成。我希望这是清楚的先生? 您需要考虑其他设计。重新上传 50MB 听起来并不多。你在拨号调制解调器上吗? :) 标准做法是每次更新主可执行文件时使用所有应用程序文件重建 wrapper.exe。这就是专业的构建环境会做的事情。更简单的选择,虽然是非标准的,是让您的 php 脚本代码在生成二进制文件时对其进行签名。另一种选择是 wrapper.exe 不包含任何文件,而是下载其余文件,安装它们,并从其中嵌入的一些众所周知的 URL 运行设置。 非常感谢您对我的帮助。是的,先生,在您所在的国家/地区上传 50MB 可能不是问题,但这里是 :(。第二个我不能在我的服务器上签名,因为第一个,它是一个 linux 服务器,第二个我的证书是使用令牌的 EV 代码签名(USB驱动器)用于签名..我希望你知道:)..最好的问候 我明白了。但是鉴于您概述的限制,没有明显的解决方案。考虑让 wrapper.exe 成为包的下载器的另一种选择。如果您能对我的回答投赞成票,我将不胜感激。我距离获得这些标签的银质徽章仅差 1 票。 :) 当然我会投票,这不是问题,如果可以的话,我会进行 2 次或更多投票,顺便说一下,先生,我不喜欢基于网络的(用户需要互联网连接才能下载和安装)安装程序:(。好吧,看来我没有解决方案了;(.. np.. 再次感谢您的支持

以上是关于EV 代码签名存在问题的主要内容,如果未能解决你的问题,请参考以下文章

自动化扩展验证 (EV) 代码签名

除了 Smartscreen 之外,代码签名 EV 证书的优势是啥?

开发者为什么需要EV代码签名证书

我应该更喜欢哪一个,常规或 EV 代码签名证书?

Win10内核驱动强制签名,申请沃通 EV代码签名证书

天威诚信代码签名证书助手操作指南