【发布时间】:2017-06-28 00:10:25
【问题描述】:
使用this guide 我正在尝试设置 MariaDB (mysql) 以在 dbserver 和 appclient 之间使用 SSL。
根据指南,我在服务器上创建了服务器和客户端证书。然后我将三个必要的客户端文件复制到 appclient 并设置所有权和权限:
[root@appclient mysql]# ll /etc/pki/tls/certs/
drwxr-xr-x. 2 mysql mysql 88 Feb 9 13:31 mysql
[root@appclient mysql]# ll /etc/pki/tls/certs/mysql/
-rw-------. 1 mysql mysql 1372 Feb 9 13:31 ca-cert.pem
-rw-------. 1 mysql mysql 1230 Feb 9 14:16 client-cert.pem
-rw-------. 1 mysql mysql 1705 Feb 9 14:16 client-key.pem
这是 appclient 上完整的 my.cnf:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
接下来,我测试了 dbserver 上的 3306 端口是开放的:
[root@appclient mysql]# telnet dbserver 3306
Connected to dbserver.
Escape character is '^]'.
R
5.5.52-MariaDB
接下来我检查了 dbserver 上的 MariaDB (mysql) ssl 变量:
MariaDB [(none)]> show variables like '%ssl%';
+---------------+------------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/pki/tls/certs/mysql/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/pki/tls/certs/mysql/server-cert.pem |
| ssl_cipher | |
| ssl_key | /etc/pki/tls/certs/mysql/server-key.pem |
+---------------+------------------------------------------+
接下来我检查了 appclient 上的 MariaDB (mysql) ssl 变量:
MariaDB [(none)]> show variables LIKE '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
7 rows in set (0.00 sec)
这看起来像是问题的开始/根源。
如果我尝试从 appclient 连接到 dbserver:
[root@appclient mysql]# mysql -h dbserver -u ssluser -p
Enter password:
ERROR 2026 (HY000): SSL connection error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
没有布宜诺。
正在使用 openssl 检查 appclient 的证书...
[root@appclient mysql]# cd /etc/pki/tls/certs/mysql/
[root@appclient mysql]# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
Error opening certificate file server-cert.pem
139864320337824:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('server-cert.pem','r')
139864320337824:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
unable to load certificate
client-cert.pem: OK
为了好玩,我在 dbserver 上运行了相同的 openssl 测试:
[root@dbserver mysql]# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: C = XX, ST = XX, L = CityName, O = MyOrganization, OU = MyGroup, CN = dbserver
error 18 at 0 depth lookup:self signed certificate
OK
client-cert.pem: OK
本教程仅提到将ca-cert.pem、client-cert.pem 和client-key.pem 复制到客户端,但上述故障表明客户端缺少server-cert.pem。
我还需要在客户端上创建 server-*.pem 文件吗?如果是这样,这些在/etc/my.cnf 文件中的什么位置?
【问题讨论】:
-
那是自签名证书吗?由于 openssl 告诉您证书验证失败,这表明您用于签署证书的权限应该添加到您正在运行的操作系统中。我不知道是否有禁止验证证书的标志,也许在这个方向上搜索一下可能会有所帮助?
-
它是自签名的。所有证书都是根据文档在 dbserver 上生成的。请注意,由于缺少
server-cert.pem,openssl 未能通过测试,本教程中未对此进行描述或解决。这就是我坚持的部分。 -
cat server-cert.pem client-cert.pem > ca.pem取得了一点进展,然后更新 appclient 的 my.cnf 以使用ssl-ca=ca.pem。我收到的是身份验证错误,而不是 SSL 错误。 -
整理好了。编写了完整的 MariaDB/SSL 操作指南,并在下面作为答案发布。
-
嗯,很少看到如此详尽的问题和更详细的答案。干得好,我 +1!