ホームページ >バックエンド開発 >C++ >.NET Framework でネゴシエートされた TLS バージョンを確認するにはどうすればよいですか?

.NET Framework でネゴシエートされた TLS バージョンを確認するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 08:03:52327ブラウズ

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

ネゴシエートされた 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 接続を確立することもできます。 TcpClientSslStream へのアクセスも提供し、ネゴシエートされた 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。