当前位置: 首页>>技术教程>>正文


在MySQL中,启用SSL

, ,

问题描述

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

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

  • ca-cert.pem

  • server-cert.pem

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

我发现a solution at the Ubuntu Forums,在/etc/mysql中移动.pem文件解决了它。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11662.html,未经允许,请勿转载。