TLS 1.3的psk连接只能使用TLS_AES_128_GCM_SHA256密码吗?

时间:2019-08-12 14:53:53

标签: ssl openssl tls1.0 tls1.3

我有一台运行在 Ubuntu 1804 OpenSSL 1.1.1 2018年9月11日的服务器。 客户端使用 PSK-AES256-CBC-SHA 作为密码使用PSK身份验证与服务器对话。

当我将Windows构建的客户端与 openssl-1.1.1c (使用Microsoft Visual Studio 2019构建)一起使用时,我无法使其正常工作。

在服务器端,我得到以下信息:

139845863200512:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../ssl/record/rec_layer_s3.c:1528:SSL alert number 40

在客户端,

11720:error:141970DF:SSL routines:tls_construct_cke_psk_preamble:psk identity not found:ssl\statem\statem_clnt.c:2917

我在 openssl-1.1.1c \ ssl \ statem \ extensions_clnt.c 中看到了以下内容。

            /*
             * We found a PSK using an old style callback. We don't know
             * the digest so we default to SHA256 as per the TLSv1.3 spec
             */
            cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);

那么这是否意味着只有 TLS_AES_128_GCM_SHA256 与TLS1.3一起使用? 是否有任何指向我可能会缺少的东西的指针?任何有关如何在Windows平台上使用客户端PSK身份验证的教程都将有所帮助。

我能够使用相同的PSK ID和密钥从Linux盒连接到服务器。但是无法通过Windows盒连接。

1 个答案:

答案 0 :(得分:3)

TLSv1.3使用与TLSv1.2及以下版本完全不同的密码套件。在此之前,TLSv1.3的密码套件不适用于协议版本,反之亦然。

  

那么这是否意味着只有TLS_AES_128_GCM_SHA256与TLS1.3一起使用?

不。 TLSv1.3 PSK可以与任何TLSv1.3兼容的密码套件一起使用。但是,OpenSSL提供了两组用于设置PSK的回调。 “旧样式”回调是在TLSv1.3出现之前设计的,而“新样式”回调是为TLSv1.3设计的。如果您的应用程序使用“旧式”回调(可能是编写为适用于OpenSSL 1.1.0或更早版本的回调),则在TLSv1.3中,PSK仅适用于基于SHA256的TLSv1.3密码套件。其中包括OpenSSL支持的所有TLSv1.3密码套件(TLS_AES_256_GCM_SHA384除外)。不要对代码中特别使用TLS_AES_128_GCM_SHA256感到困惑。在这种情况下,只有SHA256位是重要的。

但是以上所有与您的特定问题无关:

Do $$
declare 
  stm varchar(200);
begin
  stm =  'GRANT SELECT, INSERT, TRIGGER, UPDATE, DELETE, REFERENCES, RULE ON public.angus TO adcd;';
  execute immediate stm;
end;
$$

从错误中我可以看到客户端正在尝试构造CKE消息(ClientKeyExchange)。该消息不是在TLSv1.3中发送的,因此我们可以确信服务器选择了TLSv1.2(或更低版本)。错误实际上是由OpenSSL中的以下代码产生的:

11720:error:141970DF:SSL routines:tls_construct_cke_psk_preamble:psk identity not found:ssl\statem\statem_clnt.c:2917

从上面可以看到,如果OpenSSL调用应用程序回调并返回psklen 0,则该错误是由OpenSSL生成的。问题是-为什么您的代码在Windows上返回的psklen为0?