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

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

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 08:14:40964ブラウズ

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

ネゴシエートされた TLS バージョンを決定します

TLS 経由でネットワーク ハンドシェイクを開始する場合、合意された特定の TLS バージョンを特定することが、デバッグやロギングの目的にとって有益であることがよくあります。この記事では、さまざまなシナリオに合わせてこの情報を取得する方法について説明します。

.NET リフレクション API を使用する

Framework 4.7 以降で実行されている .NET アプリケーションの場合、次のメソッドはリフレクションを利用して基盤となる TlsStream にアクセスし、ネゴシエートされた TLS プロトコルを抽出します。

<code class="language-csharp">using System.Net;
using System.Reflection;
using System.Security.Authentication;

// 获取与网络请求关联的TLS流
using (var requestStream = request.GetRequestStream())
{
    // 利用反射访问TLS流的属性
    var tlsStream = requestStream.GetType()
        .GetProperty("Connection", BindingFlags.Instance | BindingFlags.NonPublic)
        .GetValue(requestStream);
    var tlsState = tlsStream.GetType()
        .GetProperty("NetworkStream", BindingFlags.Instance | BindingFlags.NonPublic)
        .GetValue(tlsStream);
    var sslProtocol = (SslProtocols)tlsState.GetType()
        .GetProperty("SslProtocol", BindingFlags.Instance | BindingFlags.NonPublic)
        .GetValue(tlsState);

    // 处理协商的TLS协议(例如,日志记录或显示)
}</code>

サーバー証明書検証コールバックを使用する

もう 1 つのアプローチには、TLS 接続の確立時に呼び出される ServerCertificateValidationCallback の使用が含まれます。このメソッドがどのように統合されるかは次のとおりです:

<code class="language-csharp">using System.Net;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

// 设置ServerCertificateValidationCallback
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => {
    // 获取TLS协议版本
    var sslProtocol = ((SslStream)sender).SslProtocol;

    // 处理协商的TLS协议(例如,日志记录或显示)
    return true;  // 回调也可以用于证书验证,此处作为一个示例显示。
};</code>

.NET セキュリティ DLL を使用する

最後に、高度なテクニックとして、secur32.dll の QueryContextAttributesW メソッドを使用してセキュリティ コンテキスト属性にアクセスします。この方法では、確立された安全な接続に関するより詳細な情報を提供できます。

<code class="language-csharp">using System;
using System.Runtime.InteropServices;

[DllImport("secur32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = false)]
private static extern int QueryContextAttributesW(
    IntPtr contextHandle,
    ContextAttribute attribute,
    ref SecPkgContext_ConnectionInfo connectionInfo);

public enum ContextAttribute
{
    // 获取TLS协议版本
    SecPkgContext_ConnectionInfo = 0x9
}

public struct SecPkgContext_ConnectionInfo
{
    public SchProtocols dwProtocol;
    // 其他属性也可以用于获取有关密码和哈希算法的信息
}</code>

注: このメソッドは非公開プロパティおよびフィールドへのアクセスを必要とするため、直接的ではありません。

これらのテクノロジーを実装することにより、開発者は HttpWebRequest および TcpClient 接続のネゴシエートされた TLS バージョンを取得できるため、デバッグやロギングのための貴重な情報を取得できるようになります。

以上が.NET アプリケーションでネゴシエートされた TLS バージョンを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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