Ausgehandelte TLS-Version ermitteln
.NET Framework 4.7-Anwendungen verwenden standardmäßig TLS 1.2. Es ist jedoch wichtig, die spezifische TLS-Version zu bestimmen, die während der sicheren Kommunikation ausgehandelt wird. So geht's:
Methode 1: Reflexion nutzen
Bei dieser Technik wird Reflektion verwendet, um auf die internen GetRequestStream()
Eigenschaften des GetResponseStream()
oder TlsStream
zurückgegebenen Streams zuzugreifen. Die TlsStream
-Klasse stellt das SslState
-Attribut bereit, das Zugriff auf die SslProtocol
-Eigenschaften bietet.
<code class="language-csharp">using System.IO.Compression; using System.Net; using System.Reflection; using System.Security.Authentication; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(decodedUri); using (Stream requestStream = request.GetRequestStream()) { SslProtocols sslProtocol = ExtractSslProtocol(requestStream); // 检查SSL版本,如有必要采取适当的措施 } private SslProtocols ExtractSslProtocol(Stream stream) { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; Stream metaStream = stream; // 处理GZip或Deflate流 if (stream is GZipStream) metaStream = (stream as GZipStream).BaseStream; else if (stream is DeflateStream) metaStream = (stream as DeflateStream).BaseStream; var tlsStream = metaStream.GetType().GetProperty("Connection", bindingFlags).GetValue(metaStream); if (!(bool)tlsStream.GetType().GetProperty("UsingSecureStream", bindingFlags).GetValue(tlsStream)) return SslProtocols.None; var tlsState = tlsStream.GetType().GetField("m_Worker", bindingFlags).GetValue(tlsStream); return (SslProtocols)tlsState.GetType().GetProperty("SslProtocol", bindingFlags).GetValue(tlsState); }</code>
Methode 2: TcpClient verwenden
Alternativ können Sie die Klasse TcpClient
verwenden, um eine TCP-Verbindung herzustellen. TcpClient
bietet auch Zugriff auf SslStream
, sodass Sie die ausgehandelte TLS-Version überprüfen können. Diese Methode ist nützlich, wenn Sie die TLS-Version ermitteln müssen, bevor Sie eine HTTP-Anfrage initiieren.
<code class="language-csharp">TlsInfo tlsInfo = null; IPHostEntry dnsHost = await Dns.GetHostEntryAsync(HostURI.Host); using (TcpClient client = new TcpClient(dnsHost.HostName, 443)) { using (SslStream sslStream = new SslStream(client.GetStream(), false, TlsValidationCallback, null)) { sslstream.AuthenticateAsClient(dnsHost.HostName, null, (SslProtocols)ServicePointManager.SecurityProtocol, false); tlsInfo = new TlsInfo(sslStream); } } public class TlsInfo { public TlsInfo(SslStream secStream) { this.ProtocolVersion = secStream.SslProtocol; } public SslProtocols ProtocolVersion { get; set; } }</code>
Beide Methoden bieten eine Möglichkeit, die ausgehandelte TLS-Version während der sicheren HTTP-Kommunikation zu bestimmen, sodass Sie fundierte Entscheidungen basierend auf Ihren Sicherheitsanforderungen treffen können.
Das obige ist der detaillierte Inhalt vonWie ermittelt man die ausgehandelte TLS-Version in .NET Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!