我支持一个 .NET 站点(其中包括许多其他内容)与来自供应商系统的远程 API 进行通信。
我们希望升级以支持 TLS 1.2 我们希望按照这个问题来这样做:是否有 TLS 1.2 的 .NET 实现?
但是一旦我进行了更改,我如何检查这是否确实有效。
理想情况下,我的一个供应商网站将开始使用 TLS 1.2 ONLY,然后我的测试可能只是“我们现在可以与该供应商交谈吗?”但我们没有那个。 我猜我可以用某种数据包嗅探器做一些事情,但我不知道我到底在寻找什么,也不知道如何设置嗅探器以可读的方式收集必要的数据。
要么:
或者
如果您在Fiddler中打开“CONNECTS”,您可以在Inspectors -> TextView
中看到TLS/SSL版本要打开连接,请转到菜单栏中的
Rules
,然后删除“隐藏连接”中的选中标记
注意: 解密 HTTPs 流量必须禁用
System.Net 跟踪确实包含足够的详细信息来检查这一点,尽管它不太容易访问。
这篇博文展示了 System.Net 跟踪中的完整 HTTPS 请求。
记录通过线路发送的字节,并且在该博客文章给出的示例中,客户端流启动:
System.Net.Sockets Verbose: 0 : [3848] Data from Socket#48285313::Send
System.Net.Sockets Verbose: 0 : [3848] 00000000 : 16 03 00 00 41 01 00 00-3D 03 00 43 26 02 90 83 : ....A...=..C&...
RFC5246 描述了 TLS 1.2 并 解释了 ClientHello 是预期的第一条消息并说明了其格式:
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-2>;
CompressionMethod compression_methods<1..2^8-1>;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ClientHello;
这个SO答案解释了记录以0x16作为类型标记开始,然后是协议版本。
上面显示的会话版本为 3.0,这意味着 SSL 3.0。
RFC 解释 3.3 是 TLS 1.2。
因此,如果您的客户端数据以“
16 03 03
”开头,则您的客户端正在尝试协商 TLS 1.2。
您可能需要检查 ServerHello 以确定实际使用的版本。
如果您向 https://check-tls.akamai.io/v1/tlsinfo.json 发出 HTTP GET 请求,它将使用客户端请求中使用的 TLS 版本进行响应;
var http = new HttpClient();
const string url = "https://check-tls.akamai.io/v1/tlsinfo.json";
var result = http.GetStringAsync(url).Result;
还可以使用curl工具https://curl.se/探测和确定TLS/SSL版本,如下所示。
命令
curl -v -k https://host:port --tlsv1.1 --tls-max 1.1
使用特定的 TLS 最低和最高版本向主机发送 https GET 请求。所以上面的命令强制客户端和服务器使用 TLS 1.1。您可以从输出中看到失败并显示错误消息
SSL_ERROR_PROTOCOL_VERSION_ALERT
此错误的原因是主机配置为使用 TLS 最低版本 1.2
绿色标记的第二个命令成功,因为客户端和服务器都支持 TLS v1.2