在MySQL中启用SSL

我正在运行Ubuntu Server 12.04,我想启用到MySQL的SSL连接。

我用OpenSSL生成了以下密钥/证书文件:

  • CA-cert.pem
  • 服务器cert.pem
  • 服务器key.pem

我将这些存储在/etc/mysql ,然后添加了以下行添加到/etc/mysql/my.cnf

 ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem 

接下来,我用sudo service restart mysql重新启动服务器。

但是,这似乎不启用SSL。 在mysql会话中:

 mysql> show variables like '%ssl%'; +---------------+----------------------------+ | Variable_name | Value | +---------------+----------------------------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | /etc/mysql/ca-cert.pem | | ssl_capath | | | ssl_cert | /etc/mysql/server-cert.pem | | ssl_cipher | | | ssl_key | /etc/mysql/server-key.pem | +---------------+----------------------------+ 

我缺少什么想法? 谢谢

Ubuntu 12.04附带了一个OpenSSL 1.0.1,它的默认值与旧的OpenSSL 0.9.8版本有些不同。

除此之外,如果你使用openssl req -newkey rsa:2048来生成一个RSA密钥,你最终会得到一个名为PKCS#8的密钥。 以PEM格式表示,这些密钥具有更通用的-----BEGIN PRIVATE KEY-----标头,它不会告诉您它是什么类型(RSA,DSA,EC)密钥。

以前,使用OpenSSL 0.9.8时,密钥始终采用称为PKCS#1的格式,表示为PEM,标题为-----BEGIN RSA PRIVATE KEY-----

因此,您无法简单地更改页眉和页脚:

 -----BEGIN PRIVATE KEY----- 

 -----BEGIN RSA PRIVATE KEY-----` 

这不是一回事,也不行。 相反,您需要使用openssl rsa将密钥转换为旧格式。 像这样:

 openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem 

Ubuntu 12.04上的MySQL(v5.5.35)正在使用名为yaSSL(v2.2.2)的SSL实现。 它期望密钥采用PKCS#1格式,并且不支持OpenSSL 1.0及更新版本使用的PKCS#8格式。 如果您只是更改页眉和页脚,正如此post中的其他post所建议的那样,MySQL / yaSSL不会抱怨,但您将无法连接,最终会出现如下错误:

 ERROR 2026 (HY000): SSL connection error: protocol version mismatch 

Ubuntu 14.04附带OpenSSL 1.0.1f和新设置。 除此之外,它还将生成带有SHA256摘要的证书,而不是早期版本中使用的SHA1。 在整体上,与MySQL捆绑在一起的yaSSL版本也不支持这一点。

如果您要生成用于MySQL的证书,请记住确保将RSA密钥转换为传统的PKCS#1 PEM格式,并且证书使用SHA1摘要。

以下是如何生成自己的CA,服务器证书和客户端证书的示例。

 # Generate a CA key and certificate with SHA1 digest openssl genrsa 2048 > ca-key.pem openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem # Create server key and certficate with SHA1 digest, sign it and convert # the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem openssl rsa -in server-key.pem -out server-key.pem # Create client key and certificate with SHA digest, sign it and convert # the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem openssl rsa -in client-key.pem -out client-key.pem 

这对我有所帮助:

文件server-key.pem的页眉和页脚看起来像这样:

 -----BEGIN PRIVATE KEY----- ... ... -----END PRIVATE KEY----- 

但它需要这样的东西:

 -----BEGIN RSA PRIVATE KEY----- ... ... -----END RSA PRIVATE KEY----- 

请注意BEGIN RSA私钥

为了查看日志:

 sudo vim /var/log/mysql/error.log 

希望这可以帮助。

我在12.04遇到了同样的麻烦,但实际上是apparmor引起了问题。

我在Ubuntu论坛找到了一个解决方案,在/etc/mysql移动.pem文件解决了它。

您还可以在/etc/apparmor.d/usr.sbin.mysqld更改apparmor配置。

确保运行mysqld进程的用户具有对密钥和证书文件的读访问权。 如果您使用帐户“mysql”启动MySQL,您将:

 /etc/mysql$ chown mysql:mysql *.pem /etc/mysql$ ls -l *.pem -rwxrwx--- 1 mysql mysql 1631 2013-09-16 14:27 ca-cert.pem -rwxrwx--- 1 mysql mysql 1281 2013-09-16 14:27 server-cert.pem -rwxrwx--- 1 mysql mysql 1679 2013-09-16 14:27 server-key.pem 

否则,您可能会在错误日志中获得以下内容:

 SSL error: Unable to get certificate from '/etc/mysql/server-cert.pem' 130916 13:32:25 [Warning] Failed to setup SSL 130916 13:32:25 [Warning] SSL error: Unable to get certificate 

在Ubuntu 16.04上,我运行了mysql_ssl_rsa_setup ,可以在问题中看到show variables中的文件,但have_sslhave_openssl仍然是DISABLED

解决方案是chown mysql.mysql /var/lib/mysql/*.pem 。 或者,我假设如果你运行mysql_ssl_rsa_setup作为mysql用户,它将创建具有正确权限的文件。

私钥文件应该看起来像(PKCS#1格式):

 -----BEGIN RSA PRIVATE KEY----- . . . -----END RSA PRIVATE KEY----- 

如果您的私钥开始改为:

 -----BEGIN PRIVATE KEY----- 

(PKCS#8格式),然后你应该像这样转换它

 openssl rsa -in server-key.pem -out server-key.pem 

不要手动手动添加“缺失”“ RSA ”标签,因为格式不同。

SSL启动选项应位于my.cnf文件的顶部,否则可能会被忽略。 我在RHEL 6.4上运行mysql 5.6时遇到问题,其中SSL变量被忽略,我在my.cnf文件的末尾有它们。 我把它们移动到文件的顶部(就在[mysqld]下面)然后我重新启动了服务器,一切都很好。