升级到 Ubuntu 20.04 后,如何调试错误“GnuTLS:握手失败(-87)‘未找到支持的密码套件’?”

升级到 Ubuntu 20.04 后,如何调试错误“GnuTLS:握手失败(-87)‘未找到支持的密码套件’?”

将(正在运行的)Ubuntu 18.04 网络服务器升级到 20.04 后,我在进行简单的 curl 请求时在日志中收到以下错误:

[Fri Nov 06 14:46:38.344069 2020] [gnutls:info] [pid xxx] [client <ip addr>] GnuTLS: Handshake Failed (-87) 'No supported cipher suites have been found.'

客户端上的 curl 输出:

$ curl -v <server>
*   Trying <ip>:443...
* TCP_NODELAY set
* Connected to <server> (<ip>) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS alert, handshake failure (552):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

GnuTLS配置如下:

        GnuTLSEnable on
        GnuTLSSessionTickets on
        GnuTLSPriorities NORMAL
        GnuTLSCertificateFile /etc/ssl/certs/server.cert
        GnuTLSKeyFile /etc/ssl/keys/server.key

客户端和服务器都是最新的 Ubuntu 20.04 主机。我已将LogLevel“调试”增加到 Apache 启动日志中,这会显示以下附加日志消息:

[Fri Nov 06 15:07:26.966137 2020] [gnutls:debug] [pid 3849] gnutls_hooks.c(501): set_default_dh_param: Setting DH params for security level 'Low'.

在调试此问题时,我发现 TLS 私钥似乎存在权限问题,但修复此问题并没有改变错误消息。我还能如何调试此问题?

答案1

我遇到了同样的错误“未找到支持的密码套件”。解决方案比我想象的要简单得多(我尝试使用不同的 TLS 客户端,检查我的服务器和客户端是否确实有通用的密码套件)。

但是,当我简单地使用证书文件和密钥文件参数运行 gnutls-serv 并为它们选择一个路径时,一切都开始正常工作。

gnutls-serv --priority="NORMAL:-VERS-TLS1.3" --x509certfile ./cert.pem --x509keyfile ./key.pem

答案2

虽然我还没有找到真正的解决方案,但@dave_thompson_085 给了我提示,让我找到一个解决方法,具体来说是使用以下设置禁用 TLSv1.3:

GnuTLSPriorities NORMAL:-VERS-TLS1.3

禁用 TLSv1.3 会产生安全隐患,因此我不确定这个解决方法是否是我的最终解决方案。

调试过程

为了调试此问题,我:

  1. 运行curl --tls-max 1.2 -v https://server/并观察输出。这暴露了服务器使用弱密钥(1024 位密钥;目前建议最低 2048 位)的问题。
  2. 尝试在 Apache 配置中禁用 TLSv1.3。禁用 TLS 1.3 后,对 Apache 的所有请求均按预期运行。

相关内容