在 MySQL 中启用 SSL

vis*_*746 25 mysql ssl openssl

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

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

  • ca-cert.pem
  • 服务器-cert.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
Run Code Online (Sandbox Code Playgroud)

接下来,我用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  |
+---------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

任何想法我错过了什么?谢谢

use*_*116 34

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-----
Run Code Online (Sandbox Code Playgroud)

-----BEGIN RSA PRIVATE KEY-----`
Run Code Online (Sandbox Code Playgroud)

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

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案太棒了——如果可以的话,我会给予巨额赏金。对问题的很好的解释。 (2认同)

小智 4

这帮助了我:

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

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

但它需要类似的东西:

-----BEGIN RSA PRIVATE KEY-----
...
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

注意 BEGIN RSA PRIVATE KEY

为了查看日志:

sudo vim /var/log/mysql/error.log
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


小智 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)