【问题标题】:MySQL SSL Remote Connection Error: Unable to get Private KeyMySQL SSL 远程连接错误:无法获取私钥
【发布时间】:2013-07-16 06:34:25
【问题描述】:

我正在尝试编写一个 PHP 脚本(托管在带有 GoDaddy 的 VPS 上),该脚本使用 SSL 连接到远程 MySQL 数据库(托管在 Amazon EC2 实例上)。

我生成了一些证书(根据http://dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html)并在远程/服务器数据库上配置了 my.cnf,如下所示:

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

[client]
ssl-ca      =/etc/mysql/ca-cert.pem
ssl-cert    =/etc/mysql/client-cert.pem
ssl-key     =/etc/mysql/client-key.pem

配置在远程/服务器端运行(也就是说,本地运行到远程数据库的 php 脚本能够使用生成的 SSL 证书建立连接)。

但是,虽然我可以在托管在 VPS 上的 PHP 脚本和远程数据库之间建立不安全的连接,但当我尝试在相同的两个系统之间建立 SSL 连接时出现错误。

如果我尝试使用以下命令通过命令行连接到远程数据库:

mysql -h hostIP --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem –u ssluser –p

我得到错误:

ERROR 2026 (HY000): SSL connection error: Unable to get private key

当我尝试通过 php 脚本连接到服务器时遇到同样的错误:

<?php
 $link = mysqli_init();

 $key   = '/home/userName/etc/mysql/certs/client-key.pem' ; 
 $cert  = '/home/userName/etc/mysql/certs/client-cert.pem'; 
 $ca    = '/home/userName/etc/mysql/certs/ca-cert.pem';
 $capath = NULL;
 $cipher = NULL;

 mysqli_ssl_set ( $link , $key , $cert , $ca , $capath , $cipher );
 mysqli_real_connect ($link, $host, $user, $pass, $schema, 3306, NULL, MYSQLI_CLIENT_SSL);
?>

导致错误:

(HY000/2026): SSL connection error: Unable to get private key

我已经尝试按照 (forums.mysql.com/read.php?11,400856,401127) 进行修复,但是进行此更改会导致“分段错误”。

有没有我遗漏的步骤?我做错了什么?

【问题讨论】:

    标签: php mysql ssl


    【解决方案1】:

    已解决

    使用

    删除了 client-key.pem 密码
    openssl rsa -in client-key.pem -out client-key2.pem
    

    按照this website 的说明。

    我变了

    $key   = '/home/userName/etc/mysql/certs/client-key2.pem' ; 
    

    mysql -h hostIP --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key2.pem –u ssluser –p
    

    但不是

    [client]
    ssl-key     =/etc/mysql/client-key.pem
    

    【讨论】:

    • 我认为第一个命令的输出应该是client-key2.pem,带有破折号,而不是下划线。
    • 您可以就地转换原始密钥:openssl rsa -in client-key.pem -out client-key.pem
    • 在 2017 年 1 月 26 日的 OpenSSL 1.0.2k 中,此命令需要密码,没有密码就无法完成。
    【解决方案2】:

    我的情况是,server-key.pem 的所有者是 root 而不是 mysql。

    【讨论】:

      【解决方案3】:

      'openssl genrsa' 生成 PKCS #1 格式的密钥:

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

      'openssl pkey'openssl req -newkey..... 以 PKCS #8 格式生成它:

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

      并且 MySQL 服务器需要 PKCS #1 格式。

      在 BEGIN 和 END 之后添加 RSA 为我解决了这个问题。

      查看链接了解详情mysql forum

      【讨论】:

        【解决方案4】:

        对我来说,需要将密钥转换为完整的 rsa 格式,而不仅仅是更改标题:

        openssl rsa -in client.key -out client.key.rsa

        感谢Velkan 在 dba exchange 上的回答。

        【讨论】:

          【解决方案5】:

          当您将 SSL CA 文件传递​​给 MySQL 中的 SSL 密钥文件时,也会发生此错误。

          【讨论】:

            猜你喜欢
            • 2015-12-17
            • 1970-01-01
            • 2020-02-18
            • 2011-10-28
            • 1970-01-01
            • 2015-11-29
            • 2023-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多