在 MySQL 中启用 SSL

在 MySQL 中启用 SSL

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

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

  • ca-证书.pem
  • 服务器证书.pem
  • 服务器密钥.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  |
+---------------+----------------------------+

知道我遗漏了什么吗?谢谢

答案1

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

答案2

这对我有帮助:

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

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

但它需要这样的东西:

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

注意 BEGINRSA私钥

为了查看日志:

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

希望这可以帮助。

答案3

我在 12.04 上遇到了同样的问题,但实际上是 apparmor 导致了这些问题。

我发现Ubuntu 论坛上的一个解决方案,移动.pem文件/etc/mysql解决了这个问题。

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

答案4

在 Ubuntu 16.04 上,我运行了mysql_ssl_rsa_setup,可以像问题中一样看到显示变量中的文件,但是have_sslhave_openssl仍然是DISABLED

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

相关内容