我想在 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
)的命令行()运行:
- 为我们的证书创建文件夹:
mkdir C:\mysqlCerts
- 设置 OpenSSL 配置的环境变量(因为遗憾的是Windows 版本中默认未设置,在撰写本文时):
set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg
- 创建 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"
- 创建服务器证书(以下 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"
- 创建客户端证书(以下 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"
- 更新 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 连接器,请在此处查看文档。