首頁 >後端開發 >C++ >如何確定 .NET Framework 中協商的 TLS 版本?

如何確定 .NET Framework 中協商的 TLS 版本?

Barbara Streisand
Barbara Streisand原創
2025-01-10 08:03:52360瀏覽

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

確定協商的TLS版本

.NET Framework 4.7應用程式預設使用TLS 1.2。但是,確定安全通訊期間協商的特定TLS版本至關重要。以下是實現此目的的方法:

方法一:使用反射

此技術涉及使用反射來存取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>

方法二:使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn