我的设置在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
包含预期的 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 数据包包含服务器支持的最低版本。