无法使用自签名SSL证书连接到mysql


15

创建自签名SSL证书后,我已经配置了远程MySQL服务器以使用它们(并且启用了SSL)

我使用SSH进入远程服务器,然后尝试使用SSL(MySQL服务器为5.5.25)连接到它自己的mysqld。

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

好的,我记得阅读过通过SSL连接到同一服务器存在一些问题。所以我将客户端密钥下载到我的本地框中,然后从那里进行测试...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

目前尚不清楚此“ SSL连接错误”错误指的是什么,但是如果省略-ssl-ca,则可以使用SSL进行连接。

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

但是,我相信这只是对连接进行加密,并没有实际验证证书的有效性(这意味着我可能会受到中间人攻击)

SSL证书有效(尽管是自签名的),并且没有密码短语。所以我的问题是,我在做什么错?如何使用自签名证书通过SSL连接?

MySQL服务器版本为5.5.25,服务器和客户端为CentOS 5。

感谢您的任何建议

编辑:请注意,在所有情况下,命令都是从ssl密钥所在的同一目录发出的(因此没有绝对路径)

编辑(作为对mgorven的回应): ca.cert是证书颁发机构证书,应该告诉mysql我的证书颁发机构是受信任的。

来自的配置my.cnf

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

我也尝试添加,ssl-cipher=DHE-RSA-AES256-SHA但是后来删除了它,因为它没有帮助。


2
什么ca.cert啊 是服务器的自签名证书吗?您是否使用客户端证书进行身份验证?请在服务器上提供与SSL相关的配置。
mgorven 2012年

谢谢,我已经用服务器的响应和ssl配置更新了我的问题。尝试连接时在命令行上传递的证书确实是客户端证书。
carpii 2012年

实际上是个好问题。在事后看来,我不确定客户端指定服务器ssl-ca是否有意义。但是随后在没有Im的情况下,加密连接没有经过严格的身份验证
carpii 2012年

Answers:


12

是的,您是正确的,如果您未指定,--ssl-ca则客户端根本不会检查服务器证书。由于没有该选项就可以工作,最有可能导致失败的原因是客户端不信任服务器证书。

如果您使用的是自签名客户端和服务器证书,则该ca.cert文件应同时包含这两个文件。这样,客户端将信任服务器证书,而服务器将信任客户端证书。

例如:
生成服务器密钥和证书:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

生成客户端密钥和证书:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

将客户端和服务器证书合并到CA证书文件中:

$ cat server-cert.pem client-cert.pem > ca.pem

非常感谢!缺少的步骤是我没有将服务器和客户端证书串联到ca.pem中。相反,我传递了最初生成的ca.cert(然后在生成客户端和服务器证书时作为--CA-key传递)
carpii 2012年

奇怪,但是它始终只对一个CA证书对我有用-客户端和服务器上都相同。
德米特里·莱斯科夫

是的,只要对DN没有特殊要求(例如,CN是一个特定值),则可以在客户端和服务器上使用相同的密钥和自签名证书。
基思·伯迪斯

3

要使用ssl的一种方式,您应该尝试:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

--ssl-cert--ssl-keyMySQL客户端上用于2路SSL。这意味着基于证书的身份验证。客户证书的主题应为用户名。


2
还请记住,进行套接字连接并使用--ssl-verify-server-cert服务器证书的CN时,必须与为-h命令行选项指定的主机相同。
基思·伯迪斯

0

碰巧您没有为服务器和客户端证书输入相同的通用名称吗?如果是,请替换其中之一,以使通用名称不同。


对我而言,德米特里·莱斯科夫(Dmitry Leskov)的解决方案行之有效。根据MySQL的SSL文档:(dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html)>使用哪种方法生成证书和密钥文件,用于服务器的通用名称值和客户端证书/密钥必须与用于CA证书的“通用名称”值不同。否则,证书和密钥文件将不适用于使用OpenSSL编译的服务器。在这种情况下的典型错误是:错误2026(HY000):SSL连接错误:错误:00000001:lib(0):func(0):reason(1)
gmas 2015年
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.