确定 Web 请求期间协商的 TLS 版本,对于调试和日志记录目的而言,可以提供宝贵的见解。
.NET 4.7 默认情况下,对 HTTP 请求使用 TLS 1.2。但是,通常需要确定连接期间实际建立的特定 TLS 版本。
本文探讨了从 HttpWebRequest.GetRequestStream()
或 HttpWebRequest.GetResponseStream()
返回的流中提取此信息的各种技术。
使用反射,我们可以访问 TlsStream
->SslState
->SslProtocol
属性值。此方法适用于压缩流和未压缩流。此外,验证在使用 request.GetRequestStream()
初始化请求时发生。
如果在初始化 WebRequest 之前获取协议信息至关重要,请考虑使用 TcpClient()
。通过使用与 WebRequest 相同的设置(支持的协议和证书验证)建立连接,您可以确定将与目标服务器协商的 TLS 协议。
secur32.dll
-> QueryContextAttributesW()
方法可用于查询已初始化流的连接安全上下文。但是,所需的上下文句柄不是公共的,只能通过反射或 AuthenticatedStream
类访问。不幸的是,这些类与 WebRequest/WebResponse 返回的流不兼容。
如果请求返回的流已进行解压缩(例如,GZIP 或 Deflate),则必须在继续使用上述方法之前提取底层的 TlsStream
。
以上是如何确定 .NET 4.7 HTTP 请求中协商的 TLS 版本?的详细内容。更多信息请关注PHP中文网其他相关文章!