確定協商的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>
使用伺服器憑證驗證回呼
另一種方法涉及使用ServerCertificateValidationCallback,該回呼在建立TLS連線時被呼叫。以下是此方法的整合方式:
<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中文網其他相關文章!