vis*_*746 25 mysql ssl openssl
我正在运行 Ubuntu Server 12.04,我想启用与 MySQL 的 SSL 连接。
我使用 OpenSSL 生成了以下密钥/证书文件:
我将这些存储在/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)
小智 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)