【问题标题】:Disabling certificate revocation checking for an application on Windows在 Windows 上禁用应用程序的证书吊销检查
【发布时间】:2013-11-15 00:34:29
【问题描述】:

我有一个 .NET 3.5 桌面应用程序,每当它所在的测试机器不在办公室时,它的功能就会周期性地变慢。
我设法在没有互联网连接的办公室机器上复制错误,但只有当我使用 ANTS 性能分析器时,我才能更清楚地了解正在发生的事情。

在 ANTS 中,我看到“等待同步”长达 16 秒,这与我在 NHibernate 尝试加载 System.Data.SqlServerCE.dll 程序集时在应用程序中看到的延迟相对应。
如果我立即再次尝试该操作,它将立即生效,但如果我将其放置 5 分钟,那么下次尝试再次加载时会很慢。

从我目前的研究来看,这似乎是因为 SqlServerCE dll 已签名,因此系统正在尝试连接以获取证书吊销列表并超时。
禁用 Internet 选项 LAN 设置中的“自动检测设置”设置可以解决问题,禁用“检查发布者证书吊销”也是如此。
但是将部署此应用程序的管理员不会对在每台机器或每个用户基础上禁用证书检查的想法感到满意,因此我真的需要让 CRL 检查的应用程序级别禁用工作。

.net 2.0 中有一个有据可查的错误,它描述了这种行为,并通过配置文件元素提供了可能的修复。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

尽管我使用的是 .net 3.5,但这对我有用。
NHibernate 正在动态加载 SQLServerCE dll,我想知道它是动态的事实是否可能是该设置不起作用的原因,但我不知道如何检查。

任何人都可以就配置设置可能不起作用的原因提供建议吗?
或者是否有另一种方法可以在应用程序级别禁用检查,也许是一个 CAS 策略设置,我可以使用它在安装应用程序时为其设置异常?
或者我可以在应用程序中进行更改以提高信任级别或类似的东西吗?

【问题讨论】:

  • 你能在服务器上安装GAC中的sqlserverCE程序集吗?,当程序集安装在GAC中时,这些程序集在加载时没有验证,只在GAC中安装时检查,查看这篇文章:msdn.microsoft.com/en-us/magazine/cc163610.aspx
  • 我无法从 GAC 中的应用程序注册 System.Data.SqlServerCe.dll,因为它是私有部署版本。更改为桌面版本允许它从 GAC 加载,但对性能没有任何影响。我在 ProcessMonitor 中看到其他 sqlce dll(例如 sqlceer40EN.dll)也正在加载(从 SQL Server CE 安装目录),当第一个加载时,我看到 15 秒延迟并调用 WinTrustVerify 等.,但它们不能在 GAC 中注册,因为它们不是 .NET dll,那么为什么要对它们进行 CRL 检查?
  • 似乎无法设置超时来禁用证书吊销,但请查看此页面:fix slow application startup 这个人解释了如何在 Windows 注册表中设置请求中的超时,如果您设置一个低值,然后会喜欢禁用。
  • 这里说how certificate revocation works 默认超时为 15 秒,这与 ANTS 时间检测到的“等待同步”事件一致
  • 您可以做的另一件事是,使用您的应用程序更改注册表并将超时设置为尽可能低。

标签: c# nhibernate certificate code-access-security certificate-revocation


【解决方案1】:

如果要检查每个应用程序的撤销列表,您可以在代码中指定:

ServicePointManager.CheckCertificateRevocationList = false;

【讨论】:

  • Colm,这是应用程序发出的第一个 httpwebrequest 吗?我见过 .NET 应用程序的第一个 Web 请求非常慢的情况。
  • 似乎没有对 Web 服务器的调用,我们看到的减速是在它找不到连接时超时,因为应用程序没有 Web 连接它会等待完全超时,直到它放弃,但是它将继续大约每 5 分钟执行一次超时,我希望它第一次意识到没有连接时它会停止尝试,但它没有。我已经尝试过注册表设置来减少这个超时时间,但它们都没有工作
【解决方案2】:

在此博客 posting(引用另一个来源)中,您有两种选择:禁用 CRL 检查系统范围或每个应用程序:

禁用 CRL 检查机器范围的控制面板 -> Internet 选项 -> 高级 -> 在安全下,取消选中检查发布者的 证书吊销选项

禁用特定 .Net 应用程序的 CRL 检查 Microsoft 知识库文章:http://support.microsoft.com/kb/936707

【讨论】:

  • @Nanhydrin,这怎么不能回答问题? OP 问道,“还有其他方法可以在应用程序级别禁用检查吗?”这个答案似乎正好解决了这个问题。
  • @Daniel-Schilling,知识库文章说要使用 generatePublisherEvidence 元素和 .NET 2.0 的修补程序,对吗?这已经尝试过,但没有奏效,应用程序是 .NET 3.5,默认情况下包含修补程序。
  • 我也有同样的问题。设置checkCertificateRevocationList="false" 无效,取消选中Internet 选项中的选项确实 起作用。我很想找到这个问题的程序化解决方案!
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2018-01-15
  • 2011-07-18
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2019-08-15
  • 2012-03-25
相关资源
最近更新 更多