我正在处理需要连接到网站服务器的.NET 4.0应用程序。我一直在定期打开和关闭以下错误(模式似乎是在午餐左右开始的,并且在簇中发生)"基础连接已关闭。发送的错误发生了出乎意料的错误。"我看到的与此错误有关的一切都指向我遇到TLS错误。我使用SSLLAB来确定远程服务器使用TLS 1.1和TLS 1.2,但只有几个可用的密码。我怀疑应用程序创建的连接偶尔会尝试使用不支持的密码,并且此错误正在命中。
由于生产环境的敏感性和此错误时间的半随机性,因此我无法在服务器上运行Wireshark或Fiddler测试,以确定失败期间使用了哪些密码。我已经验证了该应用程序正在使用TLS 1.2,但是。
是否有任何方法可以从应用程序以编程方式访问httpwebrequest对象正在使用什么密码,或者有没有一种方法可以从应用程序中指定要使用哪个密码?
我几个月前也有类似的问题,我记得在某个地方读到,密码套件的谈判是由OS(在Windows的Schannel)完成的,我无法找到一种从.NET框架内部控制它的方法。
以下文章对我有帮助,以便更好地了解围绕此的.NET框架行为(版本之间有所不同)。
使用.NET框架的运输层安全性(TLS)最佳实践
sch_use_strong_crypto flag(在我的情况下是相关的)
传输层安全性(TLS)注册表设置(此设置在Windows侧是相关的,以配置可用的密码套件)
编辑:
这是Troy Starr [MSFT]的文章,它帮助我理解了我的问题:https://community.qualys.com/thread/16917-net-framework#comment-35829
您可以在这里找到Schannel的调试信息(这是SSL握手的SSL工具/设备):
默认情况下,Microsoft SSL仅将严重的SSL连接错误记录到事件日志中。但是,您可以通过更改Windows注册表来更改此处记录的SSL连接信息的级别。首先,确保存在以下REG_DWORD注册表条目。(如果没有添加。)
hkey_local_machine system currentcontrolset control securityProviders schannel schannel eventlogging
接下来,将此新条目的值设置为" 7"。从此开始,您应该看到该服务器上的系统事件登录中显示的Schannel事件。
有关更多信息,请参阅以下Microsoft KB文章:
http://support.microsoft.com/kb/260729