openssl s_client 没有密码匹配

per*_*oud 7 openssl

尝试在中设置密码时出现以下错误openssl s_client

# openssl s_client -connect 10.0.0.3:8443 -cipher TLS_AES_128_GCM_SHA256
Error with command: "-cipher TLS_AES_128_GCM_SHA256"
140230972122240:error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match:../ssl/ssl_lib.c:2549:
Run Code Online (Sandbox Code Playgroud)

当我在 Google 中查找此错误时,它表示该密码在 报告的列表中丢失openssl ciphers。然而,这种情况并非如此:

# openssl ciphers | sed 's/:/\n/g' | grep TLS_AES_128_GCM_SHA256
TLS_AES_128_GCM_SHA256
Run Code Online (Sandbox Code Playgroud)

此错误不是服务器配置的功能,因为即使我将-connectIP 地址更改为虚假地址,也会打印该错误。显然,问题s_client甚至在尝试连接到服务器之前就发生了。

鉴于该错误消息似乎与 无关,它意味着什么openssl ciphers

Mat*_*ell 8

TLSv1.3 显着改变了密码套件的工作方式。因此,为 TLSv1.2 及以下版本定义的密码套件在 TLSv1.3 中不起作用,反之亦然。出于这个原因,OpenSSL 也在内部单独处理它们,并且它们以不同的方式配置 - 即使“在线”TLSv1.2 和 TLSv1.3 密码套件列表被合并。该openssl ciphers命令报告 TLSv1.2 和 TLSv1.3 密码套件的合并列表。

TLS_AES_128_GCM_SHA256 实际上是一个 TLSv1.3 密码套件:

$ openssl ciphers -v | grep TLS_AES_128_GCM_SHA256
TLS_AES_128_GCM_SHA256         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(128) Mac=AEAD
Run Code Online (Sandbox Code Playgroud)

因此,您需要在 s_client 中使用不同的命令行选项来使用该密码套件:

$ openssl s_client -connect 10.0.0.3:8443 -ciphersuites TLS_AES_128_GCM_SHA256
Run Code Online (Sandbox Code Playgroud)

尽管实际上上述命令将发送默认 TLSv1.2 密码套件以及上述 TLSv1.3 密码套件的组合列表。如果您需要一个密码套件,那么您还需要禁用 TLSv1.3 以下的协议版本:

$ openssl s_client -connect 10.0.0.3:8443 -ciphersuites TLS_AES_128_GCM_SHA256 -tls1_3
Run Code Online (Sandbox Code Playgroud)

但请注意,您感兴趣的密码套件位于默认的 TLSv1.3 密码套件集中,因此,如果您未设置任何其他 TLSv1.3 密码套件配置,它无论如何都会被发送。