Maison >développement back-end >C++ >Comment déterminer la version TLS négociée dans .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!