Ausgehandelte TLS-Version ermitteln
Beim Initiieren eines Netzwerk-Handshakes über TLS ist es für Debugging- oder Protokollierungszwecke oft hilfreich, die spezifische TLS-Version zu ermitteln, auf die man sich geeinigt hat. In diesem Artikel werden Möglichkeiten zum Abrufen dieser Informationen für verschiedene Szenarien untersucht.
Verwenden Sie die .NET Reflection API
Für .NET-Anwendungen, die auf Framework 4.7 oder höher ausgeführt werden, nutzt die folgende Methode Reflektion, um auf den zugrunde liegenden TlsStream zuzugreifen und das ausgehandelte TLS-Protokoll zu extrahieren:
<code class="language-csharp">using System.Net; using System.Reflection; using System.Security.Authentication; // 获取与网络请求关联的TLS流 using (var requestStream = request.GetRequestStream()) { // 利用反射访问TLS流的属性 var tlsStream = requestStream.GetType() .GetProperty("Connection", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(requestStream); var tlsState = tlsStream.GetType() .GetProperty("NetworkStream", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(tlsStream); var sslProtocol = (SslProtocols)tlsState.GetType() .GetProperty("SslProtocol", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(tlsState); // 处理协商的TLS协议(例如,日志记录或显示) }</code>
Rückruf zur Überprüfung des Serverzertifikats verwenden
Ein anderer Ansatz besteht darin, ServerCertificateValidationCallback zu verwenden, das aufgerufen wird, wenn eine TLS-Verbindung hergestellt wird. So wird diese Methode integriert:
<code class="language-csharp">using System.Net; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; // 设置ServerCertificateValidationCallback ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => { // 获取TLS协议版本 var sslProtocol = ((SslStream)sender).SslProtocol; // 处理协商的TLS协议(例如,日志记录或显示) return true; // 回调也可以用于证书验证,此处作为一个示例显示。 };</code>
Verwenden Sie die .NET-Sicherheits-DLL
Eine fortgeschrittene Technik umfasst schließlich die Verwendung der QueryContextAttributesW-Methode in secur32.dll, um auf die Sicherheitskontextattribute zuzugreifen. Diese Methode kann detailliertere Informationen über die hergestellte sichere Verbindung liefern.
<code class="language-csharp">using System; using System.Runtime.InteropServices; [DllImport("secur32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = false)] private static extern int QueryContextAttributesW( IntPtr contextHandle, ContextAttribute attribute, ref SecPkgContext_ConnectionInfo connectionInfo); public enum ContextAttribute { // 获取TLS协议版本 SecPkgContext_ConnectionInfo = 0x9 } public struct SecPkgContext_ConnectionInfo { public SchProtocols dwProtocol; // 其他属性也可以用于获取有关密码和哈希算法的信息 }</code>
Hinweis: Diese Methode erfordert Zugriff auf nicht öffentliche Eigenschaften und Felder, was sie zu einer weniger direkten Methode macht.
Durch die Implementierung dieser Technologien können Entwickler ausgehandelte TLS-Versionen für HttpWebRequest- und TcpClient-Verbindungen abrufen und so wertvolle Informationen zum Debuggen und Protokollieren erfassen.
Das obige ist der detaillierte Inhalt vonWie ermittelt man die ausgehandelte TLS-Version in .NET-Anwendungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!