mariadb 使用--ssl-verify-server-cert连接到本地主机上的MySQL时返回“SSL证书验证失败”

57hvy0tb  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(268)

我的安装程序在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包含db-host的预期CN和SAN。
我没有检查什么,或者我可以做些什么来解决这个问题?
(Side注意:最初的问题是一个web应用建立TLS加密连接失败,出现SSHHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)。我认为这是由于证书验证失败;如果我在这方面是错误的,至少我会修复证书验证。)

更新(回复Georg Richter)

我连接了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没有。威士忌龙舌兰酒flaming-moe??
(更新2.1)我仔细检查了服务器证书。X509 Subject Alternative Name包括DNS: db-host.foo.bar.baz, DNS:db-host, DNS:localhost。我得出结论,从证书的Angular 来看,使用完整主机名、短主机名和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)

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

63lcw9qa

63lcw9qa1#

这不是一个答案,但太长的评论...

一般信息:

正如您已经注意到的,MariaDB 5.5已经有好几年没有得到支持了,而且它的技术已经过时,尤其是在TLS/SSL方面:如果服务器使用Yassl而不是OpenSSL,则仍然支持易受攻击的SSLv 3协议,不支持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错误消息并不太详细。如果您登录到主机“localhost”,但服务器证书的CN中包含“db-host”,则主机名的比较将失败。

  • 错误消息:“没有合适的协议(协议被禁用....”

很可能您的应用程序需要更新的协议(TLSv1.0和TLS v1.1被禁用,例如在最近的Java版本中),而服务器不支持它。
要对此进行检查,请捕获Web和数据库服务器之间的流量,并使用Wireshark的SSL解析器分析握手数据包。第一个客户端hello数据包应包含客户端支持的最低TLS版本,服务器hello数据包应包含服务器支持的最低版本。

相关问题