確定協商的TLS版本
.NET Framework 4.7應用程式預設使用TLS 1.2。但是,確定安全通訊期間協商的特定TLS版本至關重要。以下是實現此目的的方法:
方法一:使用反射
此技術涉及使用反射來存取GetRequestStream()
或GetResponseStream()
傳回的流的內部TlsStream
屬性。 TlsStream
類別公開SslState
屬性,該屬性提供對SslProtocol
屬性的存取。
<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>
方法二:使用TcpClient
或者,您可以使用TcpClient
類別建立TCP連線。 TcpClient
還提供對SslStream
的訪問,讓您可以檢查協商的TLS版本。如果您需要在啟動HTTP請求之前確定TLS版本,此方法很有用。
<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>
這兩種方法都提供了一種在安全HTTP通訊期間確定協商的TLS版本的方法,使您可以根據安全要求做出明智的決策。
以上是如何確定 .NET Framework 中協商的 TLS 版本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!