我使用安装了 Percona MySQL 5.7 ( 5.7.21-20-log ) apt-get
,当我使用 root 帐户连接它并检查 ssl 状态时
# mysql --ssl
mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.21-20, for debian-linux-gnu (x86_64) using 6.3
Connection id: 31
Current database:
Current user: root@localhost
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
因此默认情况下会使用 SSL。但是,当我使用完整命令时
mysql -h 127.0.0.1 -P 3306 -u root -p --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/server-cert.pem --ssl-key=/var/lib/mysql/server-key.pem
它返回错误
ERROR 2026 (HY000): SSL connection error: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
答案1
您的问题是在客户端使用服务器证书和密钥。
--ssl-cert=/var/lib/mysql/server-cert.pem --ssl-key=/var/lib/mysql/server-key.pem
正如记录的那样6.4.2 加密连接的命令选项(重点是我的):
--ssl-cert=file_name
PEM 格式的 SSL 公钥证书文件的路径名。在客户端,这是客户端公钥证书。在服务器端,这是服务器公钥证书。在服务器端,此选项暗示
--ssl
。--ssl-key=file_name
PEM 格式的 SSL 私钥文件的路径名。在客户端,这是客户端私钥。在服务器端,这是服务器私钥。在服务器端,此选项暗示
--ssl
。
您可以单独使用 来强制建立 TLS 连接--ssl
:
mysql -h 127.0.0.1 -P 3306 -u root -p --ssl
这里可能还有--ssl-cipher=cipher_list
。通过它,您可以验证连接是否不使用任何您不想要的密码,即使服务器配置允许。但是,当您同时控制两者时,这应该主要在服务器端配置。