可以在TLSv1.2会话中使用TLSv1.3密码吗?

时间:2018-08-29 12:55:52

标签: ssl networking https openssl tls1.2

我正在反转一个Android应用程序,并且在嗅探时发现有些奇怪的事情发生。

TLSv1.3引入了一些新密码,例如

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • TLS_AES_128_CCM_8_SHA256
  • TLS_AES_128_CCM_SHA256

而且,根据我对OpenSSL文档(https://wiki.openssl.org/index.php/TLS1.3)的了解,

  

有一些新的密码套件只能在TLSv1.3中使用。旧的密码套件不能用于TLSv1.3连接,而新的密码套件不能用于TLSv1.2及以下版本。

现在,该应用程序执行了一些非常奇怪的操作:https://i.imgur.com/HPbFbvc

它在“客户端问候”期间使用带有新TLSv1.3密码的TLSv1.2,并且服务器也支持TLSv1.3,允许它,并且由于某种原因,它们开始通信。

那怎么可能?谢谢。

1 个答案:

答案 0 :(得分:1)

不,我想您缺少一个重要的新方面(我看不到链接的图像,您应该在问题本身内发布所有相关数据)。

出于兼容性原因,TLSv1.3尝试在ClientHello期间将其自身屏蔽为TLSv1.2,请参见https://tools.ietf.org/html/rfc8446#section-4.1.2

  

4.1.2。客户您好

     

客户端首次连接到服务器时,需要发送     ClientHello作为其第一条TLS消息。

此消息的结构:

  uint16 ProtocolVersion;
  opaque Random[32];

  uint8 CipherSuite[2];    /* Cryptographic suite selector */

  struct {
      ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
      Random random;
      opaque legacy_session_id<0..32>;
      CipherSuite cipher_suites<2..2^16-2>;
      opaque legacy_compression_methods<1..2^8-1>;
      Extension extensions<8..2^16-1>;
  } ClientHello;

请注意,legacy_version实际上是TLSv1.2,然后进行了说明:

  

legacy_version:在以前的TLS版本中,此字段用于         版本协商,并代表最高版本号         客户支持。经验表明,许多服务器         没有正确实施版本协商,导致“版本         服务器拒绝其他可接受的情况         版本高于其支持版本的ClientHello。在         TLS 1.3,客户端在         “ supported_versions”扩展名(第4.2.1节)和         legacy_version字段必须设置为0x0303,即版本         TLS 1.2的编号。 TLS 1.3 ClientHellos被确定为具有         legacy_version为0x0303,supported_versions扩展名         当前的最高版本为0x0304。         (有关向后兼容性的详细信息,请参阅附录D。)

对于密码套件和TLS版本,情况更为复杂。出于规范中说明的原因,TLSv1.3仅将其中的一部分标准化为强制性的。 但是,这也不严格禁止其他TLS版本使用它们。

请参阅:

“ AES GCM”家族是10年前在https://tools.ietf.org/html/rfc5116中定义的 TLSv1.3仅在完美的前向隐私上进行了标准化,因此,如果不使用PSK,则仅意味着(EC)DHE密钥交换(请参阅RFC8446第2部分)

看看https://security.stackexchange.com/a/77018/137710https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices#23-use-secure-cipher-suites

但是TLSv1.3密码套件的定义有所不同(新名称),因为它们将其他扩展名中的某些部分分开。

因此,您将在OpenSSL更改日志中看到此警告:

  

从TLSv1.2密码套件中分离出TLSv1.3密码套件配置        组态。 TLSv1.3密码套件与TLSv1.2和        下面。同样,TLSv1.2密码套件与TLSv1.3不兼容。        为了避免传统TLSv1.2密码套件配置的问题        否则会无意中禁用所有TLSv1.3密码套件        配置已被分离出来。请参见密码手册页或        有关更多信息,请参见SSL_CTX_set_ciphersuites()手册页。

https://github.com/openssl/openssl/pull/5392

下表中的

https://support.cloudflare.com/hc/en-us/articles/200933580-What-cipher-suites-does-CloudFlare-use-for-SSL-上的CloudFlare文档如下:

  

尽管TLS 1.3使用与以前版本的TLS相同的密码套件空间,但TLS 1.3密码套件的定义有所不同,仅指定了对称密码,不能用于TLS 1.2。同样,TLS 1.2和更低密码套件不能与TLS 1.3(IETF TLS 1.3草案21)一起使用。