我一直在尝试从使用自签名证书转向使用来自知名 CA 的通配符证书,以减少维护开销并提高安全性。该证书已经在测试服务器上使用了几个月。该设置运行良好,我可以执行以下操作(域名匿名):
mysql --host=host.example-dot-com-equivalent-for.co.uk --user=query_user --password --ssl
提供密码后连接成功。然而,当我尝试实际核实证书通用名称它失败:
$ mysql --host=host.example-dot-com-equivalent-for.co.uk --user=query_user --password --ssl --ssl-verify-server-cert
ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure
cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_SSL=yes
使用并运行客户端编译 MariaDB 5.5 后,--debug
我得到以下跟踪日志(已修剪):
mysql_real_connect: info: Connecting
mysql_real_connect: info: net->vio: 0x0 protocol: 0
mysql_real_connect: info: Server name: 'host.example-dot-com-equivalent-for.co.uk'. TCP sock: 3306
mysql_real_connect: info: IP 'client'
mysql_real_connect: info: IPV6 getaddrinfo host.example-dot-com-equivalent-for.co.uk
mysql_real_connect: info: Try connect on all addresses for host.
mysql_real_connect: info: Create socket, family: 2 type: 1 proto: 6
mysql_real_connect: info: Connect socket
mysql_real_connect: info: End of connect attempts, sock: 4 status: 0 error: 0
mysql_real_connect: info: net->vio: 0x263c540
mysql_real_connect: info: Read first packet.
mysql_real_connect: info: mysql protocol version 10, server=10
get_charsets_dir: info: charsets dir: '/usr/local/mysql/share/charsets/'
my_stat: error: Got errno: 2 from stat
run_plugin_auth: info: using plugin mysql_native_password
native_password_auth_client: info: no password
native_password_auth_client: info: IO layer change in progress...
ssl_do: info: ssl: 0x2823e50 timeout: 0
ssl_do: info: SSL connection succeeded
ssl_do: info: Using cipher: 'AES256-GCM-SHA384'
ssl_do: info: Peer certificate:
ssl_do: info: subject: '/OU=Domain Control Validated/OU=Gandi Standard Wildcard SSL/CN=*.example-dot-com-equivalent-for.co.uk'
ssl_do: info: issuer: '/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2'
ssl_do: info: no shared ciphers!
native_password_auth_client: info: IO layer change done!
ssl_verify_server_cert: info: Server hostname in cert: *.example-dot-com-equivalent-for.co.uk
run_plugin_auth: info: authenticate_user returned CR_ERROR
run_plugin_auth: info: res=0
mysql_real_connect: error: message: 2026/HY000 (SSL connection error: SSL certificate validation failure)
end_server: info: Net:
main: info: Shutting down: infoflag: 3 print_info: 1
特别注意该Server name
值与该值匹配CN
。
经 验证,证书对于给定主机名有效且未过期openssl s_client -connect host.example-dot-com-equivalent-for.co.uk:443 -verify_return_error < /dev/null
。 “X509v3 主题备用名称”字段包含“DNS:*.example-dot-com-equivalent-for.co.uk, DNS:example-dot-com-equivalent-for.co.uk”
整个证书链位于服务器ssl-cert
配置指向的文件中,如下所示其他地方推荐。 “USERTrust RSA 证书颁发机构”位于客户端的 /etc/pki/tls/certs/ca-bundle.crt 和 /etc/pki/tls/certs/ca-bundle.trust.crt 中。我尝试添加--ssl-ca=/etc/pki/tls/certs/ca-bundle.crt
到命令中,但这并没有改变任何东西。
问题最终是:MySQL/MariaDB 客户端支持通配符证书吗?如果是的话,我的连接有问题吗?
原客户:
$ mysql --version
mysql Ver 15.1 Distrib 10.1.21-MariaDB, for Linux (x86_64) using readline 5.1
调试客户端:
$ ./client/mysql --version
./client/mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1
服务器:
# rpm -q mariadb
mariadb-5.5.52-1.el7.x86_64
发布到 unix.SE 而不是 dba.SE,因为问题很可能出在 SSL 库而不是客户端。
答案1
MariaDB 客户端库不支持通配符证书,直到MariaDB 10.1.23。
Percona-Server 的客户端库开始支持通配符Percona 服务器 5.7.18-16和Percona 服务器 5.6.36-82.1
对于支持此功能的 MariaDB 和 Percona-Server 客户端库,还需要 OpenSSL 1.0.2+ 才能支持底层x509_check_host
功能
自 5.7.22 和 8.0.11 起,上游 MySQL 客户端不支持通配符证书。
这仅适用于基于 libmysqlclient.so (libperconaserverclient.so) 的客户端。对不包装 mysql C API 的其他连接器(例如 JDBC、Go 等)的 SSL 通配符支持将取决于特定的实现。