C# 在Windows上禁用应用程序的证书吊销检查

C# 在Windows上禁用应用程序的证书吊销检查,c#,nhibernate,certificate,code-access-security,certificate-revocation,C#,Nhibernate,Certificate,Code Access Security,Certificate Revocation,我有一个.NET 3.5桌面应用程序,每当它所在的测试机不在办公室时,它的功能就会周期性地降低。 我成功地在办公室的一台没有互联网连接的机器上复制了错误,但只有当我使用ANTS performance profiler时,我才能更清楚地了解到底发生了什么 在ANTS中,我看到“等待同步”长达16秒,这与我在应用程序中看到的NHibernate尝试加载System.Data.SqlServerCE.dll程序集时的延迟相对应。 如果我立即再次尝试该操作,它将毫不延迟地工作,但如果我将其保留5分钟,

我有一个.NET 3.5桌面应用程序,每当它所在的测试机不在办公室时,它的功能就会周期性地降低。
我成功地在办公室的一台没有互联网连接的机器上复制了错误,但只有当我使用ANTS performance profiler时,我才能更清楚地了解到底发生了什么

在ANTS中,我看到“等待同步”长达16秒,这与我在应用程序中看到的NHibernate尝试加载System.Data.SqlServerCE.dll程序集时的延迟相对应。
如果我立即再次尝试该操作,它将毫不延迟地工作,但如果我将其保留5分钟,则下次尝试时再次加载该操作将非常缓慢

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

在.NET2.0中有一个记录良好的bug,它描述了这种行为,并提供了一个可能的修复程序,其中包含一个config file元素

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

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

有人能就配置设置可能不起作用的原因提供建议吗?
或者,是否有其他方法可以在应用程序级别禁用检查,可能是CAS策略设置,我可以在安装应用程序时使用该设置为应用程序设置异常?
或者我可以在应用程序中更改某些内容以提高信任级别或类似的内容吗?

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

禁用CRL检查机器范围的控制面板->互联网选项-> 高级->在“安全性”下,取消选中检查发布者的 证书撤销选项

禁用特定.Net应用程序的CRL检查请参见此 Microsoft知识库文章:


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

ServicePointManager.CheckCertificateRevocationList = false;

能否在服务器上的GAC中安装sqlserverCE程序集?当程序集安装在GAC中时,这些程序集不会在加载时进行验证,只会在GAC中的安装过程中进行检查,查看本文:我无法从GAC中的应用程序注册System.Data.SqlServerCe.dll,因为它是私有部署版本。更改为桌面版本允许从GAC加载,但对性能没有任何影响。我在ProcessMonitor中看到其他sqlce dll(例如sqlceer40EN.dll)也正在加载(从SQL Server CE安装目录),当加载第一个dll时,我看到了15秒的延迟和对WinTrustVerify的调用等,但它们不能在GAC中注册,因为它们不是.NET dll,那么为什么要对它们进行CRL检查呢?似乎不可能设置一个超时来禁用证书吊销,但请查看此页面:这家伙解释了在windows注册表中如何在请求中设置超时,如果设置的值较低,则希望禁用。这里说默认超时为15秒,这与ANTS时间检测到的“等待同步”事件相吻合。另一件事,您可以做的是,更改应用程序的注册表,并将超时设置为可能的较低值。@Nanhydron,这怎么不能回答问题?OP问,“有没有其他方法可以在应用程序级别禁用检查?”这个答案似乎正好解决了这个问题。@Daniel Schilling,KB文章说使用generatePublisherEvidence元素和.NET 2.0的修补程序,对吗?这已经尝试过了,但还没有成功,应用程序是.NET3.5,默认情况下包括修补程序。我也有同样的问题。设置
checkertificaterejournalist=“false”
无效,如果不选中Internet选项中的选项,则不起作用。我很想找到解决这个问题的方案!Colm,这是应用程序发出的第一个httpwebrequest吗?我见过.NET应用程序的第一个web请求非常慢的情况。似乎没有对web服务器的调用,我们看到的慢是在找不到连接时超时,因为应用程序没有web连接,它将等待完全超时,直到放弃,然而,它将继续大约每5分钟超时一次,我希望它第一次意识到没有连接时,它会在之后停止尝试,但它没有。我尝试过注册表设置来缩短超时时间,但它们都不起作用