Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menentukan Versi TLS yang Dirundingkan dalam Rangka Kerja .NET?

Bagaimana untuk Menentukan Versi TLS yang Dirundingkan dalam Rangka Kerja .NET?

Barbara Streisand
Lepaskan: 2025-01-10 08:03:52
asal
331 orang telah melayarinya

How to Determine the Negotiated TLS Version in .NET Framework?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan