Maison >développement back-end >C++ >Comment déterminer la version TLS négociée dans .NET Framework ?

Comment déterminer la version TLS négociée dans .NET Framework ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 08:03:52378parcourir

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

Déterminer la version TLS négociée

Les applications .NET Framework 4.7 utilisent TLS 1.2 par défaut. Cependant, il est essentiel de déterminer la version TLS spécifique négociée lors des communications sécurisées. Voici comment procéder :

Méthode 1 : Utiliser la réflexion

Cette technique consiste à utiliser la réflexion pour accéder aux propriétés GetRequestStream() internes du flux GetResponseStream() ou TlsStream renvoyé. La classe TlsStream expose l'attribut SslState, qui donne accès aux propriétés 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>

Méthode 2 : Utiliser TcpClient

Vous pouvez également utiliser la classe TcpClient pour établir une connexion TCP. TcpClient donne également accès à SslStream, vous permettant de vérifier la version TLS négociée. Cette méthode est utile si vous devez déterminer la version TLS avant de lancer une requête 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>

Les deux méthodes permettent de déterminer la version TLS négociée lors de communications HTTP sécurisées, vous permettant ainsi de prendre des décisions éclairées en fonction de vos exigences de sécurité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn