我想在我安装在 Windows 机器上的 MySQL 服务器的连接上启用 SSL,所以我搜索了“使用 ssl mysql windows”。
第一个结果是这个简单明了的指南。
从它的外观来看,它似乎是我刚需要的指南。然而:
因此,我认为这种指南最好放在像 serverfault.com 这样的网站上,任何人都可以在以后提出更改答案的建议。
那么,我愿意接受这个问题的答案,只是从这个博客复制+粘贴,所以我以后可以提出修改建议。所以下次我需要在我的 MySQL 服务器中设置 SSL 时,我找不到相同的怪癖,我有一个简单而完整的指南可以遵循。并且希望谷歌稍后将其排名更高。谢谢
通常,您可以从 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
)中的命令行 ( )运行:
mkdir C:\mysqlCerts
set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg
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"
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"
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"
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_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
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 连接器,请查看此处的文档。
归档时间: |
|
查看次数: |
21791 次 |
最近记录: |