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

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

第一个结果是这个简单而直接的指南 。

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

  • 按照下面的步骤,它不起作用。
  • 在更深入地阅读了他引用的一些链接之后(比如他为客户端提交的错误–ssl-key标记),其中一些已经过时(因为我使用的是不支持MySQL的版本有这些问题)。
  • 在排除了我的问题之后,我发现它有一些含糊之处,而且可以改进的东西,但是我不能build议对它进行编辑,因为作者已经closures了他的博客(或博客条目)上的评论。

因此,如果放置在像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 )运行:

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

mkdir C:\mysqlCerts

  1. 为OpenSSLconfiguration设置环境variables(因为不幸的是 ,在编写本文的时候, 它并没有在Windows版本中默认设置 ):

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

  1. 创buildCA证书(以下2个命令创build2个文件: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. 创build服务器证书(以下2个命令创build3个文件: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. 创build客户端证书(以下2个命令创build3个文件: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的configuration文件(在Windows中,它被称为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连接器,请在这里查看文档 。