我发现当我使用httpwebrequest建立ssl\tls连接时,调用
request.GetRequestStream()
当我在启用stacktrace的情况下启用跟踪时,我发现2s将查找poxy,所以我在app.config中禁用了它:
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
下一个接近28秒的点在
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
在检查了方法体之后,我找到了对x509chain.build()的调用,生成证书链花了将近25秒。
有趣的是,当您构建新的httpwebreqest并再次尝试(不重新启动应用程序)时,需要几毫秒才能执行请求。
有人能建议怎么做吗?缓存请求不是一个选项,它应该是从应用程序运行快速。
更新:
我在x509chain.buildchain()中发现需要30秒的调用,它是:
if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))
在capisafe中声明的方法为:
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool CertGetCertificateChain([In] IntPtr hChainEngine, [In] SafeCertContextHandle pCertContext, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME pTime, [In] SafeCertStoreHandle hAdditionalStore, [In] ref CAPIBase.CERT_CHAIN_PARA pChainPara, [In] uint dwFlags, [In] IntPtr pvReserved, [In, Out] ref SafeCertChainHandle ppChainContext);
所以,它是加密api函数CertGetCertificateChain
还是不知道,下一步怎么办…
更新:
我试图禁用CRL和OCSP检查,但仍然没有效果:
添加到app.config
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
机器范围:控制面板->Internet选项->高级->安全下,
取消选中“检查发行者的证书吊销”选项
在注册表中:
[hkey_users\s-1-5-20\software\microsoft\windows\currentversion\wintrust\trust providers\software publishing]
“状态”=DWORD:00023e00
最佳答案
最后我找到了问题的根源。我在事件日志中启用了CAPI2登录,并在尝试从以下位置下载证书信任列表时发现NetworkTimeoutException:
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab
所以,这就是防火墙问题。
您可以阅读blogpost关于调查过程和使用的技术。