Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menentukan Versi TLS yang Dirundingkan dalam Rangka Kerja .NET?
Tentukan versi TLS yang dirundingkan
Aplikasi .NET Framework 4.7 menggunakan TLS 1.2 secara lalai. Walau bagaimanapun, adalah penting untuk menentukan versi TLS khusus yang dirundingkan semasa komunikasi selamat. Begini cara melakukannya:
Kaedah 1: Gunakan refleksi
Teknik ini melibatkan penggunaan pantulan untuk mengakses sifat GetRequestStream()
dalaman strim GetResponseStream()
atau TlsStream
yang dikembalikan. Kelas TlsStream
mendedahkan atribut SslState
, yang menyediakan akses kepada sifat 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>
Kaedah 2: Gunakan TcpClient
Sebagai alternatif, anda boleh menggunakan kelas TcpClient
untuk mewujudkan sambungan TCP. TcpClient
juga menyediakan akses kepada SslStream
, membolehkan anda menyemak versi TLS yang dirundingkan. Kaedah ini berguna jika anda perlu menentukan versi TLS sebelum memulakan permintaan HTTP.
<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>
Kedua-dua kaedah menyediakan cara untuk menentukan versi TLS yang dirundingkan semasa komunikasi HTTP selamat, membolehkan anda membuat keputusan termaklum berdasarkan keperluan keselamatan anda.
Atas ialah kandungan terperinci Bagaimana untuk Menentukan Versi TLS yang Dirundingkan dalam Rangka Kerja .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!