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

use*_*521 2 mysql windows ssl

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

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

从它的外观来看,它似乎是我刚需要的指南。然而:

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

因此,我认为这种指南最好放在像 serverfault.com 这样的网站上,任何人都可以在以后提出更改答案的建议。

那么,我愿意接受这个问题的答案,只是从这个博客复制+粘贴,所以我以后可以提出修改建议。所以下次我需要在我的 MySQL 服务器中设置 SSL 时,我找不到相同的怪癖,我有一个简单而完整的指南可以遵循。并且希望谷歌稍后将其排名更高。谢谢

use*_*521 9

通常,您可以从 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 |
| ...           | ...      |
Run Code Online (Sandbox Code Playgroud)

好的,所以 SSL 可用,但现在已禁用(如果值中有“NO”,则我们的二进制文件未启用 SSL,我们需要寻找新的)。我们的目的是首先配置 MySQL,以便它在这些值中显示“是”。

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'sslpassword' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

也可以对现有用户执行等效操作,通过发出以下查询来强制他使用 SSL(如果不使用则不允许她连接):

mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

(并取回它以允许他在没有 SSL 的情况下进行连接将是:)

mysql> UPDATE mysql.user SET ssl_type = '' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

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

既然这已经不碍事了,您基本上正在查看一个 6 步过程,该过程需要cmd从我们安装 OpenSSL 的文件夹(例如C:\OpenSSL-Win64\bin)中的命令行 ( )运行:

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

mkdir C:\mysqlCerts

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

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           |
+---------------+----------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如果你没有像上面那样的东西,那么某些东西效果不佳。也许您在创建证书/密钥时分配了密码?如果是这种情况,MySQL 不能使用没有密码的那些。然后我们可以通过发出以下 openssl 命令来删除它:

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

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

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
Run Code Online (Sandbox Code Playgroud)

现在 SSL 上有一些东西!让我们连接新的ssluser然后,现在使用--ssl-mode标志:

mysql.exe -ussluser -p --ssl-mode=REQUIRED
Run Code Online (Sandbox Code Playgroud)

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

(但要仔细检查,您可以尝试在没有 SSL 的情况下进行连接,以查看它是否拒绝您的连接,这样:)

mysql.exe -ussluser -p --ssl=0
Run Code Online (Sandbox Code Playgroud)

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