创建自签名 SSL 证书后,我已将远程 MySQL 服务器配置为使用它们(并启用了 SSL)
我 ssh 进入我的远程服务器,并尝试使用 SSL 连接到它自己的 mysqld(MySQL 服务器是 5.5.25)..
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
但后来删除了它,因为它没有帮助。
是的,您是正确的,如果您不指定
--ssl-ca
,则客户端根本不会检查服务器证书。由于它在没有该选项的情况下工作,因此失败的最可能原因是客户端不信任服务器证书。如果您使用的是自签名客户端和服务器证书,则该
ca.cert
文件应包含这两个文件。这样,客户端将信任服务器证书,服务器将信任客户端证书。例如:
生成服务器密钥和证书:
生成客户端密钥和证书:
将客户端和服务器证书合并到 CA 证书文件中:
要使用一种方式 ssl,您应该尝试:
mysql 客户端上的
--ssl-cert
和--ssl-key
用于 2 路 SSL。这意味着基于证书的身份验证。客户端证书的主题应该是用户名。碰巧,您没有为服务器和客户端证书输入相同的通用名称吗?如果是,请替换其中一个,以便 Common Names 不同。