使用 --ssl-verify-server-cert 连接到本地主机上的 MySQL 会返回"SSL certificate validation failure"



我的设置在db-host上运行MySQL(MariaDB 5.5,升级正在队列中,但不会在未来几个月内),并在web-host上运行Tomcat服务器。 前段时间,我们将数据库连接配置为使用 CA 的证书捆绑包。 TLS加密的连接工作正常,尽我们所能。

最近,连接被拒绝了。 我登录到db-host并尝试连接:

db-host> mysql -h localhost -u dbuser -p --ssl-ca=/etc/pki/bundle-of-certs.crt --ssl-verify-server-cert
Enter password: (correct password entered)
ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure

当我在没有ssl-verify-server-cert的情况下连接到数据库时,连接成功。 但ssl_cipher是空白的。 我已确认ssl_ca已设置为此证书文件,并且ssl_certssl_key设置为正确的证书和密钥文件以进行db-host

文件/etc/pki/bundle-of-certs.crt包含多个 CA 证书。 此文件在几个月内未更改,并且该文件包含多个有效(和一些过期)证书。

我已确认服务器证书文件有效:

db-host> openssl verify -CAfile /etc/pki/bundle-of-certs.crt /etc/pki/db-host.crt
/etc/pki/db-server.crt: OK

我还使用openssl x509 ....来确认db-host.crt包含预期的 CN 和 SAN 用于db-host

我有什么没有检查的,或者我可以做些什么来解决这个问题?

(旁注:最初的问题是建立 TLS 加密连接的 Web 应用程序失败并显示SSHHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)。 我相信这是由于证书验证失败;如果我错了,至少我会修复证书验证。

更新(回复乔治·里希特)

我与mysql -h db-host -u user --ssl-verify-server-cert ....联系. 我又得到了SSL certificate validation failure.

只是为了仔细检查,我跑了show variables like '%ssl%';

| Variable_name | Value
+---------------+--------------
| have_openssl  | YES
| have_ssl      | YES
| ssl_ca        | /etc/pki/bundle-of-certs.crt
| ssl_capath    | (blank)
| ssl_cert      | /etc/pki/db-host.crt
| ssl_cipher    | (blank)
| ssl_key       | /etc/pki/db-host.key

更新 2

db-host> mysql -u user -h db-host -p --ssl
Enter password:
MariaDB [(none)]: s
SSL:    Cipher in use is DHE-RSA-AES256-GCM-SHA384
MariaDB> show variables like 'ssl_cipher'
| ssl_cipher    | (blank)

这些查询结果不一致。

我返回并在命令行上用正确的值与--ssl-ca --ssl-cert --ssl-key连接。 就像这个测试一样,s报告正在使用RSA密码,但show variables没有。 威士忌龙舌兰酒火焰萌??

(更新 2.1) 我仔细检查了服务器证书。X509 Subject Alternative Name包括DNS: db-host.foo.bar.baz, DNS:db-host, DNS:localhost。 我的结论是,从证书的角度来看,使用完整主机名、短主机名和本地主机进行连接都是等效的。

更新 3

我在 https://www.cyberciti.biz/faq/how-to-setup-mariadb-ssl-and-secure-connections-from-clients/找到了一篇有用的文章。 它向我展示了状态密码可以存在,ssl_cipher为空。 从那我跑了:

> show status like 'ssl_version';
| Ssl_version     | TLSv1.2
> show status like 'ssl_cipher';
| Ssl_cipher      | DHE-RSA-AES256-GCM-SHA384
> show variables like 'ssl_cipher';
| Ssl_cipher      | (blank)

我现在怀疑我最初的问题是有效的,但我一直在错误的方向寻找答案。

这不是答案,但评论太长了......

常规:

正如您已经注意到的那样,MariaDB 5.5 已经好几年没有被支持了,并且技术已经过时,尤其是在 TLS/SSL 方面: 几个漏洞未修复。如果服务器使用 Yassl 而不是 OpenSSL,则仍然支持易受攻击的 SSLv3 协议,不支持 TLS 协议> 1.1,并且握手错误很难调试,因为 Yassl 不会发回所需的警报,但会关闭连接并显示未加密的错误消息。

使用更新的OpenSSL版本构建5.5将不起作用,因为MariaDB 10.3中添加了OpenSSL 1.1.x支持。

一些意见/问题:

  • 服务器使用哪个 TLS 库?

    SHOW VARIABLES like 'have%ssl'

    如果 have_openssl=YES,则使用 OpenSSL

  • 证书验证

    在 5.5 中,TLS 错误消息并不是很详细。如果您登录到主机"本地主机",但服务器证书 在其CN中包含"db-host",主机名的比较将失败。

  • 错误消息:"没有适当的协议(协议已禁用....">

    您的应用程序很可能需要更新的协议(TLSv1.0 和 TLS v1.1 被禁用,例如在最近的 Java 版本中),并且 服务器不支持它。

    要检查这一点,请捕获 Web 和数据库服务器之间的流量并进行分析 带有Wireshark的SSL剖析器的握手数据包。第一个客户端 hello 数据包应包含客户端支持的最低 TLS 版本,服务器 hello 数据包包含服务器支持的最低版本。

最新更新