在 MySQL 5.7 上使用默认 SSL 证书/密钥?

Rya*_*yan 6 mysql

我安装了 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
Run Code Online (Sandbox Code Playgroud)

所以默认情况下,正在使用 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
Run Code Online (Sandbox Code Playgroud)

它返回错误

ERROR 2026 (HY000): SSL connection error: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Run Code Online (Sandbox Code Playgroud)

Esa*_*nen 5

您的问题是在客户端使用服务器证书和密钥。

--ssl-cert=/var/lib/mysql/server-cert.pem --ssl-key=/var/lib/mysql/server-key.pem
Run Code Online (Sandbox Code Playgroud)

6.4.2 加密连接的命令选项中所述(重点是我的):

--ssl-cert=file_name
Run Code Online (Sandbox Code Playgroud)

PEM 格式的 SSL 公钥证书文件的路径名。在客户端,这是客户端公钥证书。在服务器端,这是服务器公钥证书。在服务器端,此选项意味着--ssl.

--ssl-key=file_name
Run Code Online (Sandbox Code Playgroud)

PEM 格式的 SSL 私钥文件的路径名。在客户端,这是客户端私钥。在服务器端,这是服务器私钥。在服务器端,此选项意味着--ssl.

您可以--ssl单独使用,强制 TLS 连接:

mysql -h 127.0.0.1 -P 3306 -u root -p --ssl
Run Code Online (Sandbox Code Playgroud)

这里有用的也可能是--ssl-cipher=cipher_list. 有了它,您可以验证连接不使用任何您不想要的密码,即使服务器配置允许。但是,当您对两者都拥有权力时,这应该主要在服务器端进行配置。