gpt4 book ai didi

ssl - 基于 SSL 的 MariaDB 无法正常工作, "certificate verify failed"

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:21 29 4
gpt4 key购买 nike

使用 this guide我正在尝试设置 MariaDB (mysql) 以在 之间使用 SSL数据库服务器 应用客户端 .

根据指南,我在服务器上创建了服务器和客户端证书。然后我将三个必要的客户端文件复制到 应用客户端 并设置所有权和权限:

[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

接下来我检查了 上的 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 |
+---------------+------------------------------------------+

接下来我检查了 上的 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)

这看起来像是问题的开始/根源。

如果我尝试连接到 数据库服务器 来自 应用客户端 反正:
[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...
[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

为了好玩,我在 上运行了相同的 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.pemclient-key.pem到客户端,但上面的失败指向缺少 server-cert.pem在客户端。

我还需要在客户端上创建 server-*.pem 文件吗?如果是这样,这些在 /etc/my.cnf 中的位置?文件?

最佳答案

一些 MySQL/MariaDB SSL 设置指南中缺少的部分是确保 ssl-ca证书文件包含服务器和客户端 ca。

这是对我有用的分步指南:

这个答案假设有两台服务器:

  • dbserver(我们的数据库所在的位置)
  • appclient(我们的应用程序所在的位置)

  • FWIW,两台服务器都是 SELinux 强制执行的。

    一、登录dbserver

    创建用于创建证书的临时目录。
    mkdir /root/certs/mysql/ && cd /root/certs/mysql/

    创建服务器证书
    openssl genrsa 2048 > ca-key.pem
    openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
    openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
    openssl rsa -in server-key.pem -out server-key.pem
    openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

    将服务器证书移至 /etc/pki/tls/certs/mysql/目录路径假定为 CentOS 或 RHEL(根据其他发行版的需要进行调整):
    mkdir /etc/pki/tls/certs/mysql/
    cp /root/certs/mysql/* /etc/pki/tls/certs/mysql/

    请务必设置文件夹和文件的权限。 mysql 需要完全的所有权和访问权。
    chown -R mysql:mysql /etc/pki/tls/certs/mysql

    现在配置 MySQL/MariaDB
    # vi /etc/my.cnf
    # i
    [mysqld]
    bind-address=*
    ssl-ca=/etc/pki/tls/certs/ca-cert.pem
    ssl-cert=/etc/pki/tls/certs/server-cert.pem
    ssl-key=/etc/pki/tls/certs/server-key.pem
    # :wq

    然后
    systemctl restart mariadb

    不要忘记打开防火墙以允许来自 appclient 的连接(使用 IP 1.2.3.4)
    firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
    # I force everything to the drop zone. Season the above command to taste.

    现在重启firewalld
    service firewalld restart

    接下来登录dbserver的mysql服务器:
    mysql -uroot -p 

    发出以下命令为客户端创建用户。注意 GRANT 语句中的 REQUIRE SSL。
    GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
    FLUSH PRIVILEGES;
    # quit mysql

    从第一步开始,您仍然应该在/root/certs/mysql 中。如果没有,请 cd 回到它以获取以下命令之一。

    创建客户端证书
    openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
    openssl rsa -in client-key.pem -out client-key.pem
    openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

    备注 :我为服务器和客户端证书使用了相同的通用名称。 YMMV。

    确保您仍然是/root/certs/mysql/下一个命令

    将服务器和客户端 CA 证书合并到一个文件中:
    cat server-cert.pem client-cert.pem > ca.pem

    确保您看到两个证书:
    cat ca.pem 

    暂时结束服务器端工作。

    打开另一个终端并
    ssh appclient

    和以前一样,为客户端证书创建一个永久主页
    mkdir /etc/pki/tls/certs/mysql/

    现在,将客户端证书(在 dbserver 上创建)放在 appclient 上。
    您可以对它们进行 scp 处理,或者只是一个一个地复制和粘贴文件。
    scp dbserver
    # copy files from dbserver to appclient
    # exit scp

    同样,请务必设置文件夹和文件的权限。 mysql 需要完全的所有权和访问权。
    chown -R mysql:mysql /etc/pki/tls/certs/mysql

    您应该有三个文件,每个文件都由用户 mysql 拥有:
    /etc/pki/tls/certs/mysql/ca.pem
    /etc/pki/tls/certs/mysql/client-cert.pem
    /etc/pki/tls/certs/mysql/client-key.pem

    现在在 [client] 中编辑 appclient 的 MariaDB/MySQL 配置部分。
    vi /etc/my.cnf
    # i
    [client]
    ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
    ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
    ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
    # :wq

    重启appclient的mariadb服务:
    systemctl restart mariadb

    还在客户端这里

    这应该返回: ssl TRUE
    mysql --ssl --help

    现在,登录到appclient的mysql实例
    mysql -uroot -p

    应该看到下面的两个变量都是 YES
    show variables LIKE '%ssl';
    have_openssl YES
    have_ssl YES

    一开始我看到
     have_openssl NO

    快速浏览 mariadb.log 发现:

    SSL error: Unable to get certificate from '/etc/pki/tls/certs/mysql/client-cert.pem'



    问题是 root 拥有 client-cert.pem 和包含的文件夹。
    解决方案是将/etc/pki/tls/certs/mysql/的所有权设置为 mysql。
    chown -R mysql:mysql /etc/pki/tls/certs/mysql

    如果需要,从上面的步骤重新启动 mariadb

    现在我们已准备好测试安全连接

    我们还在 appclient 上

    尝试使用上面创建的帐户连接到 dbserver 的 mysql 实例。
    mysql -h dbserver -u iamsecure -p
    # enter password dingdingding (hopefully you changed that to something else)

    运气好的话,您应该可以正确登录。

    要确认您已启用 SSL 连接,请从 MariaDB/MySQL 提示符发出以下命令:
    \s 

    那是一个反斜杠 s,又名 status

    这将显示您的连接状态,应如下所示:
    Connection id:      4
    Current database:
    Current user: iamsecure@appclient
    SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
    Current pager: stdout
    Using outfile: ''
    Using delimiter: ;
    Server: MariaDB
    Server version: 5.X.X-MariaDB MariaDB Server
    Protocol version: 10
    Connection: dbserver via TCP/IP
    Server characterset: latin1
    Db characterset: latin1
    Client characterset: utf8
    Conn. characterset: utf8
    TCP port: 3306
    Uptime: 42 min 13 sec

    如果您在尝试连接时遇到权限被拒绝错误,请检查上面的 GRANT 语句以确保没有任何杂散字符或 ' 标记。

    如果您有 SSL 错误,请返回本指南以确保步骤有序。

    这适用于 RHEL7,也可能适用于 CentOS7。无法确认这些确切步骤是否适用于其他地方。

    希望这可以为其他人节省一点时间和麻烦。

    关于ssl - 基于 SSL 的 MariaDB 无法正常工作, "certificate verify failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145925/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com