我在使用 MySQL 和 OpenSSL 时遇到了困难。我在 Ubuntu 16.04 上运行 MySQL 5.7 和 OpenSSL 1.1.0g
无论我加载什么证书,如果证书已验证,MySQL 都会启动但不通过 SSL 建立连接。例如,如果我允许它创建自己的证书,则 /var/log/mysql/error.log 中的内容如下:
2019-02-17T09:42:25.666293Z 0 [注意] 在数据目录中找到 ca.pem、server-cert.pem 和 server-key.pem。尝试使用它们启用 SSL 支持。
2019-02-17T09:42:25.666543Z 0 [警告] CA 证书 ca.pem 是自签名的。
很正常。但是:
/usr/bin/openssl s_client -connect localhost:3306
给了我这个:
已连接(00000003)
140234876264896:错误:1408F10B:SSL 例程:ssl3_get_record:错误版本号:../ssl/record/ssl3_record.c:252:
如果我使用 openssl 创建单独的 CA 和自签名证书,则没有任何区别 - 同样的错误。作为最后的手段,我尝试将我的 Web 服务器的 LetsEncrypt 证书与 LE CA 证书一起使用,以避免使用自签名证书,结果完全相同。
事实证明,任何尝试连接的应用程序(如 phpMyAdmin)也会因 OpenSSL 错误而失败,除非允许不安全地连接。
如果我设置$cfg['Servers'][$i]['ssl_verify'] = false;
它phpMyAdmin/admin/config.inc.php
,它将通过 SSL 连接,但会出现“未经验证”的警告。
从那以后,我认为这看起来像是 CA 错误,而不是证书错误,但由于无论配置了什么 CA 证书,我都会得到相同的结果,所以我很困惑。有什么建议吗?
答案1
MySQL SSL 连接不仅仅是带有 MySQL 连接的标准 SSL 连接。
当建立这种连接时,MySQL 客户端首先使用 MySQL 纯文本协议与服务器握手(如果双方都同意使用 SSL),然后在同一个 TCP 连接上启动 SSL 连接。
OpenSSL 或其他通用 SSL 客户端无法理解 MySQL 纯文本协议,它们将直接建立 SSL 连接,而没有那些 MySQL 特定的握手,然后报告版本错误,因为它根本不是一个标准的 SSL 服务器。
MySQL如何建立SSL连接的文档:https://dev.mysql.com/doc/internals/en/ssl.html