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

时间:2013-04-30 19:55:03

标签: .net performance .net-4.0 digital-signature authenticode

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

谷歌搜索引导我: http://support.microsoft.com/kb/936707基本上说我必须将generatePublisherEvidence设置为false。

但是MSDN上的description of generatePublisherEvidence指出这不适用于.NET 4.尽管我尝试了这个设置,但确实有效。我仔细检查过我的二进制文件确实以.NET 4为目标。

有人可以解释一下这种行为吗?

4 个答案:

答案 0 :(得分:2)

我按照http://support.microsoft.com/kb/936707中提到的步骤进行了操作,基本上我必须在应用程序的App.Config中将 generatePublisherEvidence 设置为 false

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

  

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

有关详细信息,另请参阅文章:http://support.microsoft.com/kb/941990

答案 1 :(得分:2)

我遇到了类似的情况:没有互联网的服务器上的authenticode签名应用程序 访问有一个无法解释的重大启动延迟。将 generatePublisherEvidence 设置为 假似乎解决了这个问题,但是我无法对这是为什么这么做出明确的解释 必要的。

微软的documentation of the generatePublisherEvidence-element 我把这两个笔记搞糊涂了:

  

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

  

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

经过长时间的调查,使用Process MonitorCertutil 并调试到.NET Framework source code,我的结论是:

generatePublisherEvidence元素定义仍然与.NET 4相关,甚至是我使用的4.7! 如果没有它,签名总是被运行时验证为一部分 装配加载过程,但签名验证可能仍会在某个时刻触发(无意中)!

继续阅读以获取更多详情。

.NET 2和3.5

在装载程序集时,将始终验证数字签名,作为其中的一部分 初始化代码访问安全(CAS)机制使用的所谓证据对象。 默认情况下,发布者证据是从数字签名创建的证据 没有在CAS中使用过,所以大多数时候这只是浪费时间。并作为 解释here

  

Authenticode验证会增加启动时间。 Authenticode签名的程序集有   与证书颁发机构(CA)核实。此验证可能非常耗时,   因为它可能需要多次连接到网络才能下载当前证书   撤销清单。它还确保了有完整的有效证书链   受信任根的路径。加载程序集时,这可能会转换为几秒钟的延迟。

     

考虑在客户端计算机上安装CA证书,或避免使用Authenticode   什么时候有可能。如果您知道您的申请不需要出版商证据,   您无需支付签名验证的费用。

     

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

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

.NET 4

证据对象的初始化现在是delayed until actually needed, 避免在以前版本中导致的启动惩罚。这意味着数字签名不再存在 总是在装配加载过程中验证。但事实证明,所有证据对象都存在 正在初始化,包括很少使用的出版商证据!

在我的情况下,我有一个使用Oracle.ManagedDataAccess库的应用程序 在启动时查询数据库。该库依赖于特定的配置部分 (&#34; oracle.manageddataaccess.client&#34;)在应用程序配置中。出于某种原因,我做到了 不在我的app.config文件中包含这样的配置(也不在我的machine.config中)。

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

System.Configuration程序集然后决定必须初始化所有证据对象。

由于我的申请经过数字签名,因此包括初始化发布者证据, 这意味着验证签名,CRL检查以及随附的所有内容。 发布者证据实际上并未使用,只有强名称证据才是其中的一部分 用户配置文件,所以这只是浪费时间。

添加&#34; oracle.manageddataaccess.client&#34;我的app.config文件的部分避免了这个, 不需要初始化完整的证据对象集,数字签名就可以了 不再验证。启动延迟消失了。

通常,将generatePublisherEvidence元素设置为false可确保发布者 只要框架决定必须初始化证据对象,就不包括证据!

答案 2 :(得分:0)

问题很可能是由针对用于签名的证书执行的OCSP和CRL检查引起的。这可以显着增加时间。遗憾的是,我们发现没有办法禁用这些检查(无论如何这种禁用会导致潜在的安全问题)所以我们根本不会使用Authenticode对程序集进行签名,而只是强名称。

答案 3 :(得分:0)

另见文章:http://support.microsoft.com/kb/941990

  

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