只有TLS_AES_128_GCM_SHA256密码适用于 TLS 1.3 的 psk 连接吗?



我有一个服务器运行在Ubuntu 1804上,带有OpenSSL 1.1.1 11 Sep 2018。 客户端使用 PSK 身份验证与服务器通信,并将PSK-AES256-CBC-SHA作为密码。

当我使用基于Windows构建的客户端和openssl-1.1.1c(使用Visual Studio 2019构建Microsoft时,我无法使其工作。

在服务器端,我得到以下内容:

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:sslstatemstatem_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 盒连接到服务器。但无法从窗口框连接。

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

那么这是否意味着只有TLS_AES_128_GCM_SHA256适用于TLS1.3?

TLSv1.3 PSK 可与任何 TLSv1.3 兼容的密码套件一起使用。但是,OpenSSL 提供了 2 组用于设置 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位很重要。

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

11720:error:141970DF:SSL routines:tls_construct_cke_psk_preamble:psk identity not found:sslstatemstatem_clnt.c:2917

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

psklen = s->psk_client_callback(s, s->session->psk_identity_hint,
identity, sizeof(identity) - 1,
psk, sizeof(psk));
if (psklen > PSK_MAX_PSK_LEN) {
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, ERR_R_INTERNAL_ERROR);
goto err;
} else if (psklen == 0) {
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
SSL_R_PSK_IDENTITY_NOT_FOUND);
goto err;
}

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

最新更新