如何测试我的 .NET 客户端使用的是哪个版本的 TLS?

How to test which version of TLS my .NET client is using?

我支持一个 .NET 站点,它(在许多其他事物中)与来自供应商系统的远程 API 对话。

我们想要升级以支持 TLS 1.2 我们希望按照这个问题这样做:Are there .NET implementation of TLS 1.2?

但是,一旦我进行了更改,我该如何检查它是否真的有效。

理想情况下,我的一个供应商站点将开始使用 TLS 1.2 ONLY 然后我的测试可能只是 "can we talk to that supplier now?" 但我们没有那个。 我猜我可以用某种数据包嗅探器做点什么,但我不知道我到底在找什么,也不知道如何设置嗅探器以可读的方式收集必要的数据。

或者:

或者

System.Net 跟踪确实包含足够的详细信息来检查这一点,尽管它不是很容易访问。

This KB describes how to turn on System.Net tracing.

This blog post shows a full HTTPS request in System.Net tracing.

记录了通过线路发送的字节,并且在该博客 post 上给出的示例中,客户端流开始:

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 和 explains that ClientHello is the first message expected and states its format:

  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;

This SO answer explains 记录以 0x16 作为类型标记开始,然后是协议版本。

上面显示的会话版本为 3.0,which means SSL 3.0

The RFC explains 3.3 是 TLS 1.2。

因此,如果您的客户端数据以“16 03 03”开头,那么您的客户端正在尝试协商 TLS 1.2。

您可能需要检查 ServerHello 以确定实际使用的版本。

如果您在 Wireshark 中捕获连接创建,并检查来自客户端的第一个数据包,那么 Wireshark 将为您注释 ClientHello 结构中的字段,包括客户端请求的 TLS 版本。

同样,如果您查看来自服务器的第一个回复数据包,Wireshark 将为您注释 ServerHello 结构中的字段,包括为连接确定的 TLS 版本。

请参阅 this blog post or this one 了解工作示例。

如果在 Fiddler 中打开“CONNECTS”,您可以在 Inspectors -> TextView

中看到 TLS/SSL 版本


要打开连接,请转到菜单栏中的 Rules,然后删除 "Hide CONNECTs"

的勾选

注意:解密 HTTPs 流量必须禁用

参考:Viewing HTTPS Handshakes in Fiddler