Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 数字签名后托管Windows服务启动缓慢_.net_Performance_.net 4.0_Digital Signature_Authenticode - Fatal编程技术网

.net 数字签名后托管Windows服务启动缓慢

.net 数字签名后托管Windows服务启动缓慢,.net,performance,.net-4.0,digital-signature,authenticode,.net,Performance,.net 4.0,Digital Signature,Authenticode,我们最近尝试对.NET二进制文件进行数字签名。我们有一个Windows服务,通常在10秒内启动。然而,在我们开始数字签名后,时间增加到20-30秒左右 谷歌搜索让我想到: 这基本上是说我必须将generatePublisherEvidence设置为false 但MSDN上的说明指出,这不适用于.NET4。尽管如此,我还是尝试了这个设置,它确实起了作用。我仔细检查了我的二进制文件是否以.NET4为目标 有人能给我解释一下这种行为吗?这个问题很可能是由对用于签名的证书执行OCSP和CRL检查引起的。

我们最近尝试对.NET二进制文件进行数字签名。我们有一个Windows服务,通常在10秒内启动。然而,在我们开始数字签名后,时间增加到20-30秒左右

谷歌搜索让我想到: 这基本上是说我必须将generatePublisherEvidence设置为false

但MSDN上的说明指出,这不适用于.NET4。尽管如此,我还是尝试了这个设置,它确实起了作用。我仔细检查了我的二进制文件是否以.NET4为目标


有人能给我解释一下这种行为吗?

这个问题很可能是由对用于签名的证书执行OCSP和CRL检查引起的。这可以显著增加时间。不幸的是,我们没有找到禁用这些检查的方法(无论如何,这种禁用会导致潜在的安全问题)因此,我们不必使用Authenticode对程序集进行签名,而只需对其进行强名称。

我遵循了其中提到的步骤,基本上说我必须在我的应用程序的App.Config中将generatePublisherEvidence设置为false

编辑:根据ssdi的回答,延迟的根本原因是:

出现此问题是因为应用程序必须下载 用于身份验证的证书吊销列表(CRL)。然而,缺乏 网络连接中断会导致下载超时而失败。对于 例如,防火墙可能会阻止下载。当窗口 首先,网络连接尚未初始化

有关更多详细信息,请参见文章。

另请参见文章:

出现此问题是因为应用程序必须下载证书吊销列表(CRL)进行身份验证。但是,网络连接不足会导致下载超时而失败。例如,防火墙可能会阻止下载。Windows首次启动时,网络连接尚未初始化


我也遇到过类似的情况:在没有internet的服务器上使用authenticode签名的应用程序 访问有无法解释的重大启动延迟。将generatePublisherEvidence设置为 false似乎解决了这个问题,但我无法确切解释为什么会这样 必要的

微软的 让我困惑的是这两个音符:

在.NET Framework 4及更高版本中,此元素对程序集加载时间没有影响

我们建议服务使用该元素来提高启动性能。使用此元素还可以帮助避免可能导致超时和取消服务启动的延迟

经过长时间的调查,使用, 我的结论是:

generatePublisherEvidence元素肯定仍然与.NET 4相关,甚至与我使用的4.7相关! 不再是没有签名的情况,签名总是由运行时作为签名的一部分进行验证 程序集加载过程,但签名验证可能仍会在某个点(无意中)触发

请继续阅读以了解更多详细信息


.NET2和3.5 当加载程序集时,作为 代码访问安全性(CAS)机制使用的所谓证据对象的初始化。 默认情况下,根据数字签名创建的发布者证据为 没有在CAS中使用,所以大多数情况下这只是浪费时间。作为 解释:

Authenticode验证会增加启动时间。具有Authenticode签名的程序集 由认证机构(CA)进行验证。这种验证可能很耗时, 因为下载当前证书可能需要多次连接到网络 撤销名单。它还确保服务器上有完整的有效证书链 指向受信任根的路径。加载部件时,这可能会转化为几秒钟的延迟

考虑在客户端计算机上安装CA证书,或避免使用Authenticode 如果可能的话。如果您知道您的应用程序不需要发布者证据, 您不必支付签名验证的费用

从.NET Framework 3.5开始,有一个允许Authenticode的配置选项 要绕过的验证。为此,请将以下设置添加到app.exe.config文件中:

<configuration>
  <runtime>
    <generatePublisherEvidence enabled="false"/>
  </runtime>
</configuration>

.NET 4 现在正在初始化证据对象, 为了避免在以前的版本中导致启动惩罚。这意味着数字签名不再是 在装配加载过程中始终进行验证。但事实证明,在某些情况下,所有证据都是客观存在的 正在初始化,包括很少使用的发布者证据

在我的例子中,我有一个应用程序,它使用Oracle.ManagedDataAccess库 在启动时查询数据库。此库依赖于特定的配置部分 应用程序配置中的(“oracle.manageddataaccess.client”)。因为某种原因我这么做了 不在我的app.config文件(也不在我的machine.config)中包含此类配置

当询问此配置部分时,System.configuration程序集 要访问配置,将首先查看machine.config,然后 在应用程序配置中。当它在其中任何一个中都找不到请求的节时 它查找位于%AppData%子文件夹路径中的特定于用户的配置文件。 这些文件的完整路径包含程序集的强名称,因此 必须创建强名称证据

系统配置程序集然后决定必须初始化所有证据对象。

由于我的应用程序是数字签名的,这包括初始化发布者证据, 这意味着使用CRL che验证签名