气隙的.NET代码签名应用程序无法安装/运行

时间:2017-05-22 22:02:45

标签: c# .net windows installation digital-certificate

我们最近更新了我们的应用程序,以便使用带有新证书的SHA-256代码签名。程序集是使用Visual Studio 2015中的Sign the assembly选项签名的强名称.Visual Studio中的post build事件运行两个signtool.exe进程,以便在SHA-256和旧版SHA-1证书中进行签名:

call "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" 
sign /f "<mystrongName.pfx>" /p "<password>" /t 
<timestampURL> "$(TargetPath)"

call "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" 
sign /f "<mystrongName.pfx>" /p "<password>" /fd sha256 /tr 
<timestampURL> /td sha256 /as /v "$(TargetPath)"

最后,我们使用Advanced Installer作为安装包装程序,并且根据.exe签名使用证书和时间戳在Digital Signature页面上进行代码签名。

最终安装文件将按照您的预期在Internet连接的Windows计算机上安装和运行。安装时,您可以通过setup.exe和运行时的属性看到证书已分配且有效,以及证书链。此外,Windows将应用程序识别为来自受信任的来源,并显示相应的经过验证的发布者详细信息。

我们的客户群主要是全球100家公司,大部分部署将在气隙网络中进行。在此环境中的第二次更新部署之一中,无法验证证书,导致安装程序无法完成。

这是有道理的,因为Windows(2012服务器R2)计算机与Internet隔离,并且由于公司策略,Turn off Automatic Root Certificates设置为Enabled。此设置可以在MMC应用程序的Computer Configuration -> Administrative Templates -> System -> Internet Communication Management -> Internet Communication Settings文件夹中找到(您需要安装证书插件)。

在我们的本地测试平台上进行测试时,如果上述注册表设置是默认设置(Disabled),即使未连接到Internet的计算机也会安装设置实用程序中的证书。我们可以通过更改策略设置以匹配客户(Enabled)来复制问题。

作为解决方法,我们手动下载了证书颁发机构根证书并将其安装为受信任的根证书,安装将正常进行。

当我们向客户提供此变通方法时,尽管证书颁发机构根证书存在于计算机的受信任根证书中,但安装仍然失败。

证书颁发机构客户服务团队建议我们从签名过程中删除时间戳以允许安装继续进行 - 这是他们提供的唯一帮助(这是另一个故事)。但是,这意味着一旦代码签名证书过期,应用程序将停止运行或将显示未经验证的发布者错误。

我并不完全相信这也可以解决问题,因为当我们在本地测试时,安装程​​序仍然可以找到证书,并且在手动安装证书颁发机构根证书时允许安装继续。

我无法做的是复制客户环境以准确再现问题(这没有帮助)。几乎就像Windows绕过本地计算机的受信任的根证书存储区。我假设如果这是可能的,那么Windows可以验证中央根证书存储。

这甚至可以在Windows中设置吗?如果是这样,我会在哪里找到关于此的文档或如何完成?

我是否在代码签名步骤中或在理解安装机器检查证书时应该发生的事情时遗漏了什么?

我不知道如何让这个安装程序正常工作。我无法承受的是继续回到客户那里让他们继续测试我们的安装。首先,它真的不是正确的调试过程,因为供应供应商并不是要解决的客户问题,但更重要的是,我需要我们的团队了解导致这种情况的原因以及如何正确地解决这个问题。

理想情况下,如果我不需要,我不会删除时间戳,因为如果软件在证书到期之前没有升级,这将导致新问题。

任何和所有帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

我认为无法在气隙环境中验证证书的一个原因可能是无法验证撤销。您可能知道,证书可以被撤销,并且有两种不同的协议可以检查它是否是CRL和OCSP。两者都需要网络访问颁发证书的CA.

是否实际检查撤销受到here所述政策的约束,这可能会导致您的问题。