如何修复“mysqli :: real_connect():SSL操作失败”错误?

时间:2016-09-05 12:31:50

标签: php mysql ssl openssl

环境: Ubuntu 14.04 ,PHP 5.5.9 ,MYSQL 5.6.30

我不时会收到错误

  

mysqli::real_connect(): SSL操作失败,代码为1. OpenSSL

错误消息:

  

错误:1408F10B:SSL例程:SSL3_GET_RECORD:版本号错误

Front / nginx位于一台服务器上,而mysql位于不同的服务器上。

错误不是连续的,它是随机发生的,我在错误日志中找到了这些错误消息,所以我无法真正进行完全调试。

示例:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$this->objMySqli = mysqli_init();
mysqli_options ($this->objMySqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);

$this->objMySqli->ssl_set($this->SslKey, $this->SslCertificate, $this->SslCACertificate, null, null);

$link = $this->objMySqli->real_connect($this->Server, $this->Username, $this->Password, $this->Database, $this->Port);      

if (!$link) {
    throw new QMySqliDatabaseException("Unable to connect to Database", -1, null);
}

SSL密码:

enter image description here

此行失败:

$link = $this->objMySqli->real_connect($this->Server, $this->Username, $this->Password, $this->Database, $this->Port);

2 个答案:

答案 0 :(得分:0)

mysql版本5.6.30有问题, 我已经更新到5.6.32,现在这个错误不再发生了。

答案 1 :(得分:0)

升级并没有解决我的问题,但我确实找到了新的解决方案。

  

TLDR; 将您的PKCS#8格式密钥转换为PKCS#1格式密钥

openssl rsa -in example.com.server.key.pem -out example.com.server.key.pkcs1.pem

我遇到了这些错误:

MySQL Bug 71271

MySQL Bug 64870

基本上,如果您的私钥是PKCS#8格式而不是PKCS#1格式,MySQL将不会“找到”私钥。

许多Stack Overflow答案都说重命名页眉和页脚,在页眉和页脚中包含RSA,如下所示:

来自(PKCS#8格式)

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

To(PKCS#1格式)

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

但是,这不会更改页眉和页脚之间的私钥数据。使用带有修改后的页眉和页脚的PKCS#8格式密钥时,MySQL启动时没有出现错误,但是当我尝试连接mysqli时,我得到了

error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

通过将我的私钥转换为PKCS#1格式,密钥可以工作,我可以正常连接:

openssl rsa -in example.com.server.key.pem -out example.com.server.key.pkcs1.pem

请注意,较新的OpenSSL版本,至少1.0.2j(我使用的是)使用时输出PKCS#8键

openssl req -config "openssl.cnf" \
-keyout "private/example.com.server.key.pem" -new -sha256 \
-days 3652 -nodes -out "csr/example.com.server.csr.pem"

但是使用不同的选项可能会输出PKCS#1键(可能是-newkey rsa:2048,我还没有测试过)。这可以解释为什么只有一些人在使用openssl生成的私钥时遇到这种情况。

在MySQL 5.6.17和5.7.14中出现了这个问题,所以好像错误没有修复。