我希望我的网络服务器通过 SSL 连接与 MySQL 数据库服务器通信。网络服务器运行 CentOS5,数据库服务器运行 FreeBSD。证书由中间 CA DigiCert 提供。
MySQL 应该使用 ssl,根据my.cnf
:
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem
当我启动 MySQL 时,守护程序启动时没有错误。这表明证书文件都是可读的。
但是当我尝试从网络服务器连接到数据库服务器时,我得到一个错误:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
如果我尝试使用 openssl 进一步调试:
[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:
这是测试与 MySQL 数据库服务器的 SSL 连接的有效方法吗?该SSL23_GET_SERVER_HELLO:unknown protocol
消息很奇怪,因为这通常是您在用于非 SSL 流量的端口上使用 SSL 时所看到的。
同样的 openssl 命令似乎适用于 LDAP 和 HTTP 服务器:
$ openssl s_client -connect ldap.example.org:636 0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443 0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
OpenSSL 版本 1.1.1(2018 年 9 月 11 日发布)添加了对
-starttls mysql
提交a2d9cfbac5d87b03496d62079aef01c601193b58的支持。不幸的是,我在 OpenSSL 更改日志中找不到对这个新功能的引用。如果您的发行版还没有这个版本,那么在https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz有一个静态编译的 openssl 二进制文件,它确实支持
-starttls mysql
. 我在http://www.danneman.org/presentations/Automation_TLS_Configuration_Verification.pdf中找到了对它的引用。对于 Windows,可以在https://wiki.openssl.org/index.php/Binaries找到 OpenSSL 1.1.1 二进制文件
我按照https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html中的描述生成了 SSL 证书,尝试过,它可以工作:
OpenSSL 1.1.1也
-starttls
支持 postgres 和 ldap。有关完整列表,请参阅https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831。回答我自己的问题。如果您有更好的权威来源的更好答案,请发布答案。
简短的回答;不,OpenSSL 不能用于调试 MySQL SSL 连接。这是因为 MySQL 使用明文启动会话,然后切换到 SSL。
在阅读https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html时,MySQL 从明文连接开始,然后启动实际的 SSL。这解释了 MySQL 如何能够在一个端口(端口 3306)上侦听明文和加密连接。将此与 HTTP 或 LDAP 服务器进行比较,其中一个端口用于明文连接,第二个端口用于加密连接。
此问题的常见原因是 CA 证书的通用名称 (CN) 与服务器和/或客户端证书相同。
见这里: https ://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
尝试重新创建您的 CA 和证书,并确保在所有情况下都使用唯一的 CN。
我在 MacOS X 客户端与 Ubuntu 服务器通信时遇到了类似的问题。
如果您遗漏客户端证书和客户端密钥,仅使用服务器证书的 CA,您能否检查连接是否有效?你能建立加密连接吗?这通常需要关联用户的 ssl_type 列的 ANY 设置。
只是想为后代注意,如果您想在 MySQL 和客户端之间使用负载均衡器(例如 F5 或 HAProxy),您需要将 SSL 证书从负载均衡器导入 MySQL 服务器。这是由于类似 STARTTLS 的连接启动。
openssl s_client -starttls mysql
在以下帮助下,我找到了另一种方法来代替sslscan --starttls-mysql
: