我的安装程序在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_cert
和ssl_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)
我现在怀疑我最初的问题是正确的,但我一直在错误的方向寻找答案。
1条答案
按热度按时间63lcw9qa1#
这不是一个答案,但太长的评论...
一般信息:
正如您已经注意到的,MariaDB 5.5已经有好几年没有得到支持了,而且它的技术已经过时,尤其是在TLS/SSL方面:如果服务器使用Yassl而不是OpenSSL,则仍然支持易受攻击的SSLv 3协议,不支持TLS协议〉1.1,并且握手错误很难调试,因为Yassl不发送回所需的警报,而是关闭连接并显示未加密的错误消息。
使用较新的OpenSSL版本构建5.5将不起作用,因为在MariaDB 10.3中添加了OpenSSL 1.1.x支持。
一些意见/问题:
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数据包应包含服务器支持的最低版本。