我想在连接到我安装在Windows机器上的MySQL服务器上启用SSL,所以我使用了“使用ssl mysql窗口”。
第一个结果是这个简单而直接的指南 。
从它的外观来看,这似乎是我刚才需要的指南。 然而:
因此,如果放置在像serverfault.com这样的网站上,任何人都可以提出修改答案,我认为这种指南会更好。
那么,我愿意接受这个问题的答案,这个答案只是从这个博客复制粘贴,所以我稍后可以提出修改。 所以下次我需要在我的MySQL服务器上设置SSL时,我不会find同样的问题,我有一个简单明了的完整指南。 希望这个排名更高的谷歌。 谢谢
通常,可以从MySQL网站下载的用于Windows的MySQL服务器的二进制文件已经使用SSL支持编译。 这意味着服务器支持此function,但默认情况下不启用。 要仔细检查是否属于这种情况,我们可以通过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是可用的,但现在DISABLED(如果它有一个“NO”值,SSL没有启用我们的二进制文件,我们需要寻找新的)。 我们的目的是首先configurationMySQL,以便在这些值中显示“是”。
您还可以通过发出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
(当我们在服务器中启用SSL时,这将变得非常方便,但是仍然要确保SSL正在用于特定用户/连接。)
现在我们进入了这个mysql控制台,让我们来创build将使用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步的过程,它需要从我们安装OpenSSL的文件夹(例如C:\OpenSSL-Win64\bin
)的命令行( cmd
)运行:
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
,而不是Linux中的my.cnf
,而不是my-default.ini
因为后者是一个模板),通常位于C:\ProgramData\MySQL\MySQL Server 5.7\
(注意:ProgramData是一个隐藏文件夹),将其包含在[mysqld]
部分下: 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
,然后检查我们的sslvariables:
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 | +---------------+----------------------------------------+
如果你没有上面的东西,有些东西不能很好地工作。 也许你在创build证书/密钥时分配了密码? 如果是这样的话,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有一些东西在上面! 现在用–ssl-mode标志来连接我们的新ssluser
:
mysql.exe -ussluser -p --ssl-mode=REQUIRED
如果连接,我们就完成了。
(但要仔细检查,你可以尝试连接没有SSL,看看它是否拒绝你的连接,这种方式:)
mysql.exe -ussluser -p --ssl=0
现在您应该configuration您的应用程序通过SSL使用其连接器。 例如,如果您使用.NET连接器,请在这里查看文档 。