在MySQL中启用SSL


24

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

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

  • ca-cert.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  |
+---------------+----------------------------+

有什么想法我想念的吗?谢谢


2
看看这个很棒的线程 ..也许它可以帮助您。
SirCharlo 2012年

感谢SirCharlo的链接,但是该线程中解决的问题似乎不适用于我的情况。
2012年

1
@SirCharlo提到的是您要查找的地方。特别是Apparmor部分并发布#10。我在Debian Squeeze或较旧的Ubuntu上生成的密钥可以正常工作-在12.04中重新生成使其再次失败。另请参见MySQL错误日志。
gertvdijk

2
我有同样的问题,花了数小时,但@ user262116的答案解决了它。如果可以帮助您,我鼓励您接受该答案!
elixenide 2015年

Answers:


33

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格式。如果您仅更改此页眉和页脚(如该线程中的其他帖子所建议的那样),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

1
这篇文章为我节省了一天!很棒的解释和解决方案。
generalopinion 2014年

我收到“错误2026(HY000):SSL连接错误:ASN:将来的日期之前”
Nitsan Baleli 2014年

不幸的是,我仍然收到ERROR 2026 (HY000): SSL connection error: protocol version mismatch错误消息(使用OpenSSL 1.0.1f)。我切换到OpenSSL 1.0.1e,并按照上述说明进行操作。
耶勒(Jarrett)2015年

2
这个答案是惊人的-如果可以的话,将奖励巨大的赏金。这个问题的很好的解释。
elixenide

另一个声音加入了部落。一直在互联网上寻找解决方案,以解决为什么MySQL记录的设置无法正常工作的问题-这篇文章的底部完全节省了我的时间。
史蒂夫·钱伯斯

4

这对我有帮助:

文件server-key.pem的页眉和页脚如下所示:

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

但是它需要这样的东西:

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

请注意BEGIN RSA PRIVATE KEY

为了查看日志:

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

希望这可以帮助。


我在Ubunbtu 12.04中使用mysql 5.5.34遇到了类似的问题,其中pem文件都可以被所有人读取,但仍然给我同样的问题。但是,这个答案加上更换所有者的方法可以解决问题。
汤米·安德森

不要手动添加“ RSA” -这只会消除错误,但是SSL无法正常工作(您将收到另一个错误“ SSL连接错误:协议版本不匹配 ”)。从PKCS#8转换为PKCS#1格式,而不要使用openssl rsa
rustyx '16

3

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

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

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


这也是我遇到的问题
Jonathan

那是错字吗?您的意思是“将pem文件移至”而不是“将pem文件移入”?对不起,我很
脚,

1

确保运行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

大。但是,怎么办呢?花一点时间并进一步解释,提供更多信息:)
Lucio 2013年

结合将RSA添加到server-key.pem文件即可达到目的。
汤米·安德森

1

在Ubuntu 16.04,我跑mysql_ssl_rsa_setup,可以看到显示的变量文件中的问题,但have_sslhave_openssl继续保持DISABLED

解决的办法是chown mysql.mysql /var/lib/mysql/*.pem。另外,我假设如果您以mysql用户身份运行mysql_ssl_rsa_setup,它将创建具有正确权限的文件。


这个问题已有四年零两个月了……OP不太可能会回答您的答案。
WinEunuuchs2Unix

1
我将其发布为服务仅是为将来的读者提供服务,因为这是针对该问题的Google顶级搜索结果之一,而我所读的书也无济于事。这个答案的价值指的是Ubuntu 12.04甚至14.04的世界状态,这已经失去了意义。
克雷格·赖特

@ WinEunuuchs2Unix也许不是OP,但是在这里,差不多两年后,我正在寻找确切的答案。所以,谢谢克雷格!
Oldskool

0

私钥文件应类似于(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

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


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.