Gan*_* R. 7 .net performance .net-4.0 authenticode digital-signature
我们最近尝试对.NET二进制文件进行数字签名。我们有一个Windows服务,通常会在10秒内启动。但是,当我们开始对其进行数字签名后,时间增加到20-30秒左右。
谷歌搜索导致我这样:http : //support.microsoft.com/kb/936707,它基本上说我必须将generatePublisherEvidence设置为false。
但是在MSDN上对generatePublisherEvidence的描述指出了这样的事实,即它不适用于.NET 4。我再次检查了我的二进制文件是否针对.NET 4。
有人可以向我解释这种行为吗?
我遇到了类似的情况:无法访问 Internet 的服务器上的验证码签名应用程序出现无法解释的严重启动延迟。将generatePublisherEvidence设置为 false 似乎解决了这个问题,但我无法明确解释为什么这是必要的。
Microsoft 的generatePublisherEvidence 元素文档 让我对以下两个注释感到困惑:
在 .NET Framework 4 及更高版本中,此元素对程序集加载时间没有影响。
和
我们建议服务使用该元素来提高启动性能。使用此元素还有助于避免可能导致超时和取消服务启动的延迟。
经过长时间的调查,使用Process Monitor、 Certutil 和调试到.NET Framework 源代码中,我的结论是:
generatePublisherEvidence 元素仍然适用于 .NET 4,甚至是我使用的 4.7!没有它的情况不再是签名总是由运行时作为程序集加载过程的一部分进行验证,但签名验证可能仍会在某些时候(无意中)被触发!
请阅读以获得更多详情。
作为代码访问安全 (CAS) 机制使用的所谓证据对象初始化的一部分,在加载程序集时始终会验证数字签名。由数字签名创建的发布者证据在 CAS 中默认不使用,因此大多数情况下这只是浪费时间。正如这里所解释的:
Authenticode 验证会增加启动时间。Authenticode 签名的程序集必须通过证书颁发机构 (CA) 进行验证。这种验证可能很耗时,因为它可能需要多次连接到网络才能下载当前的证书吊销列表。它还确保在通往受信任根的路径上存在完整的有效证书链。在加载程序集时,这可能会导致几秒钟的延迟。
考虑在客户端计算机上安装 CA 证书,或尽可能避免使用 Authenticode。如果您知道您的应用程序不需要发布者证据,则无需支付签名验证的费用。
从 .NET Framework 3.5 开始,有一个配置选项允许绕过 Authenticode 验证。为此,请将以下设置添加到 app.exe.config 文件中:
Run Code Online (Sandbox Code Playgroud)<configuration> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> </configuration>
证据对象的初始化现在被延迟到实际需要时,以避免在以前的版本中导致的启动惩罚。这意味着在程序集加载过程中不再总是验证数字签名。但事实证明,在某些情况下,所有证据对象都被初始化,包括很少使用的发布者证据!
就我而言,我有一个应用程序,它使用 Oracle.ManagedDataAccess 库在启动时查询数据库。该库依赖于应用程序配置中的特定配置部分(“oracle.manageddataaccess.client”)。出于某种原因,我没有在 app.config 文件(也不在我的 machine.config 中)包含这样的配置。
当询问此配置部分时,负责访问配置的 System.Configuration 程序集将首先查看 machine.config,然后查看应用程序配置。当它在其中任何一个中都找不到请求的部分时,它会查找特定于用户的配置文件,位于 %AppData% 的子文件夹路径中。这些文件的完整路径包括程序集的强名称,因此必须创建强名称证据。
System.Configuration 程序集然后决定必须初始化所有证据对象。
由于我的应用程序是数字签名的,这包括初始化发布者证据,这意味着验证签名、CRL 检查以及随之而来的所有内容。发布者证据实际上并没有被使用,只有强名称证据是用户配置文件路径的一部分,所以这只是浪费时间。
将“oracle.manageddataaccess.client”部分添加到我的 app.config 文件避免了这种情况,不需要初始化完整的证据对象集,并且不再验证数字签名。启动延迟消失了。
通常,将 generatePublisherEvidence 元素设置为 false 可确保在框架决定必须初始化证据对象时不包含发布者证据!
我按照http://support.microsoft.com/kb/936707中提到的步骤操作,基本上说我必须在应用程序的App.Config中将generatePublisherEvidence设置为false 。
编辑:根据 ssdi 的回答,延迟的根本原因是因为:
出现此问题的原因是应用程序必须下载证书吊销列表 (CRL) 进行身份验证。但是,缺乏网络连接会导致下载因超时而失败。例如,防火墙可能会阻止下载。当 Windows 首次启动时,网络连接尚未初始化。
另请参阅文章:http://support.microsoft.com/kb/941990了解更多详细信息。