确定 .NET 应用程序中协商的 TLS 版本
.NET 4.7 对于 HTTP 请求默认使用 TLS 1.2;但是,连接建立过程中使用的实际 TLS 版本可能会有所不同。 本指南概述了两种确定协商的 TLS 版本的方法。
方法一:反思
该技术利用反射来访问内部属性和字段来获取 SSL 协议版本。 请注意,这依赖于内部 API,并且可能会随着未来的 .NET 更新而改变。
<code class="language-csharp">using System.IO.Compression; using System.Net; using System.Net.Security; using System.Reflection; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; // ... other code ... ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; // ... other code ... Uri requestUri = new Uri("https://somesite.com"); var request = WebRequest.CreateHttp(requestUri); // ... other code ... using (var requestStream = request.GetRequestStream()) { // Request stream validated; now extract SSL protocol SslProtocols sslProtocol = ExtractSslProtocol(requestStream); if (sslProtocol != SslProtocols.None) { // Process the sslProtocol value } } // ... ExtractSslProtocol function (implementation would be provided here) ...</code>
方法 2:安全连接上下文属性(高级)
此方法通过 secur32.dll
库访问连接上下文属性。 这种方法涉及使用非公共句柄和结构,使其不太可移植并且可能更复杂。 (由于复杂性和潜在的不稳定性,省略了详细的实现。)
重要注意事项:
RemoteCertificateValidationCallback
: 此回调提供了对所使用的安全协议的深入了解,有助于 TLS 版本识别。TcpClient
: 使用 TcpClient
允许在 初始化之前检索 TLS 信息,从而启用主动 TLS 版本确定。WebRequest
以上是如何确定 .NET 中协商的 TLS 版本?的详细内容。更多信息请关注PHP中文网其他相关文章!