ネゴシエートされた TLS バージョンを決定します
.NET Framework 4.7 アプリケーションは、デフォルトで TLS 1.2 を使用します。ただし、安全な通信中にネゴシエートされる特定の TLS バージョンを決定することが重要です。その方法は次のとおりです:
方法 1: リフレクションを使用する
この手法には、リフレクションを使用して、返された 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>
方法 2: 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 中国語 Web サイトの他の関連記事を参照してください。