使用 Windows 作为服务器和客户端时在 MySQL 中启用 SSL

使用 Windows 作为服务器和客户端时在 MySQL 中启用 SSL

我想在 Windows 机器上安装的 MySQL 服务器连接上启用 SSL,因此我在 Google 上搜索“使用 ssl mysql windows”。

第一个结果是这个简单明了的指南

从外观上看,这似乎是我刚好需要的指南。然而:

  • 按照步骤操作后,不起作用。
  • 更深入地阅读了他引用的一些链接(例如他为接受空的--ssl-key标志的客户端提交的错误)后,我发现其中一些已经过时了(因为我正在使用的MySQL版本没有这些问题)。
  • 在解决了我的问题之后,我发现它存在一些模糊之处,以及可以改进的地方,但是我无法建议对其进行修改,因为作者已经关闭了他的博客(或博客条目)上的评论。

因此,我认为如果将这类指南放在像 serverfault.com 这样的网站上会更好,任何人都可以稍后对答案提出修改意见。

那么,我愿意接受这个问题的答案,它只是从这个博客复制粘贴过来的,这样我以后就可以提出修改意见了。这样下次我需要在我的 MySQL 服务器中设置 SSL 时,就不会发现同样的怪癖了,而且我有一个简单而完整的指南可以遵循。希望以后谷歌能给我更高的排名。谢谢

答案1

通常,您可以从 MySQL 网站下载适用于 Windows 的 MySQL 服务器二进制文件,这些文件已编译为支持 SSL。为了再次检查是否如此,我们可以通过以下方式连接到我们的实例mysql -uroot -p(在 Windows 中,mysql.exe位于C:\Program Files\MySQL\MySQL Server 5.7\bin)并运行:

mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ...           | ...      |

好的,SSL 可用,但目前处于禁用状态(如果值中包含“NO”,则表示我们的二进制文件未启用 SSL,我们需要寻找新的 SSL)。我们的目的是首先配置 MySQL,使其在这些值中显示“YES”。

您还可以通过发出查询来查看当前连接是否正在使用 SSL status

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          551
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 13 days 22 hours 23 min 24 sec

(当我们在服务器中启用 SSL 但仍想确保 SSL 正在用于特定用户/连接时,这将变得方便。)

现在我们已经进入了这个 mysql 控制台,让我们创建将使用 SSL 模式的用户(用户名是ssluser,密码是sslpassword):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'sslpassword' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;

对于现有用户,也可以执行相同的操作,强制他使用 SSL(如果她不使用则不允许她连接),方法是发出以下查询:

mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

(并且要恢复它以允许他在没有 SSL 的情况下进行连接,请执行以下操作:)

mysql> UPDATE mysql.user SET ssl_type = '' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

现在您需要在您的机器上安装/使用 OpenSSL。许多机器已经安装了这个,当然大多数 Linux 机器也安装了。对于 Windows,您可以从以下网址下载这里

现在,这些都已经解决了,您基本上需要查看一个 6 步骤的过程,该过程需要从cmd我们安装 OpenSSL 的文件夹(例如C:\OpenSSL-Win64\bin)的命令行()运行:

  1. 为我们的证书创建文件夹:

mkdir C:\mysqlCerts

  1. 设置 OpenSSL 配置的环境变量(因为遗憾的是Windows 版本中默认未设置,在撰写本文时):

set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg

  1. 创建 CA 证书(以下 2 个命令创建 2 个文件:ca-cert.pem 和 ca-key.pem):

openssl genrsa 2048 > "C:\mysqlCerts\ca-key.pem"

openssl req -new -x509 -nodes -days 3600 -key "C:\mysqlCerts\ca-key.pem" > "C:\mysqlCerts\ca-cert.pem"

  1. 创建服务器证书(以下 2 个命令创建 3 个文件:server-cert.pem、server-key.pem 和 server-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\server-key.pem" > "C:\mysqlCerts\server-req.pem"

openssl x509 -req -in "C:\mysqlCerts\server-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\server-cert.pem"

  1. 创建客户端证书(以下 2 个命令创建 3 个文件:client-cert.pem、client-key.pem 和 client-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\client-key.pem" > "C:\mysqlCerts\client-req.pem"

openssl x509 -req -in "C:\mysqlCerts\client-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\client-cert.pem"

  1. 更新 MySQL 的配置文件(在 Windows 中,它被称为my.ini,而不是my.cnf 在 Linux 中,也不是my-default.ini因为后者是一个模板),该文件通常位于C:\ProgramData\MySQL\MySQL Server 5.7\(注意:ProgramData 是一个隐藏文件夹),并将其包含在以下[mysqld]部分下:

注意:如果您的路径中有\s,则需要将其替换为,\\s因为 mysqld 会将 \s 替换为空格字符,这会破坏密钥的路径。额外的反斜杠会转义原始反斜杠,从而使您的路径保持完整。

ssl-ca = "C:\mysqlCerts\ca-cert.pem"

ssl-cert = "C:\mysqlCerts\\server-cert.pem"

ssl-key = "C:\mysqlCerts\\server-key.pem"

并重新启动 mysql 服务/服务器。

现在让我们通过普通用户(不是ssluser)再次连接mysql -uroot -p,并检查我们的 ssl 变量:

mysql> show global variables like '%ssl%';
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| have_openssl  | YES                                    |
| have_ssl      | YES                                    |
| ssl_ca        | C:\mysqlCerts\ca-cert.pem              |
| ssl_capath    |                                        |
| ssl_cert      | C:\mysqlCerts\server-cert.pem          |
| ssl_cipher    |                                        |
| ssl_crl       |                                        |
| ssl_crlpath   |                                        |
| ssl_key       | C:\mysqlCerts\server-key.pem           |
+---------------+----------------------------------------+

如果您没有上述内容,则某些事情没有正常工作。也许您在创建证书/密钥时指定了密码?如果是这样,MySQL 就无法在没有密码的情况下使用它们。然后我们可以通过发出以下 openssl 命令将其删除:

openssl rsa -in "C:\mysqlCerts\server-key.pem" -out "C:\mysqlCerts\server-key-ppless.pem"

然后my.ini再次更改为指向这个新的-ppless.pem-suffixed 文件。再次重启 mysql,再次连接,检查现在have_ssl是否正常YES。是吗?通过显示状态进行仔细检查:

mysql> status
--------------
mysql.exe  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 46 sec

现在 SSL 上有东西了!让我们连接我们的新ssluser东西,现在使用--ssl 模式旗帜:

mysql.exe -ussluser -p --ssl-mode=REQUIRED

如果连接成功,我们就完成了。

(但为了仔细检查,您可以尝试不使用 SSL 进行连接,看看它是否拒绝您的连接,方法是:)

mysql.exe -ussluser -p --ssl=0

现在您应该将应用配置为通过 SSL 使用其连接器。例如,如果您使用.NET 连接器,请在此处查看文档

相关内容