首页 文章

mysqli_real_connect()获取SSL3_GET_SERVER_CERTIFICATE:证书验证失败

提问于
浏览
0

我们刚刚从 php 5.4 升级到 php 5.6 ,使用MySQLi和SSL连接MySQL时一切正常 .

我们的联系如下:

mysqli_real_connect($db, $host, $username, $password, $database, $port, $socket, MYSQLI_CLIENT_SSL);
mysqli_set_charset($db, "utf8");

Howerver,现在当我们尝试使用php 5.6通过SSL连接MySQL时,我们得到:

警告:mysqli_real_connect():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证在第29行的/MySQLConnection.php中失败警告:mysqli_real_connect():无法通过使用连接到MySQL第29行/MySQLConnection.php中的SSL警告:mysqli_real_connect():[2002](尝试通过tcp://mysql1.ourdomain.com:3306连接)第29行/MySQLConnection.php警告:mysqli_real_connect():( HY000 / 2002):在第29行的/MySQLConnection.php中

我尝试过设置:

mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);

但这没有用 .

更新

我补充说:

$mysql_certs_path = "/full/path/to/certs/mysql";
mysqli_ssl_set($db, $mysql_certs_path . "/client-key.pem", $mysql_certs_path . "/client-cert.pem", $mysql_certs_path . "/ca-cert.pem", null, null);

仍然得到:

警告:mysqli_real_connect():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证在第31行的/MySQLConnection.php中失败警告:mysqli_real_connect():无法通过使用连接到MySQL第31行的/MySQLConnection.php中的SSL

2 回答

  • 0

    @jww,我写了一篇文章,分享@Justin面临的问题 . 根据my post,Google Cloud SQL颁发的证书的CN具有以下模式:

    CN=project-name:instance-id
    
  • 0

    有类似的事情发生在我身上 . 当我将PHP升级到5.6时,它起作用了 . 但是当我进入时:

    sudo apt-get install php5-mysqlnd
    

    在Ubuntu 15.04上,SSL到AWS RDS停止工作,即使它与libmysql驱动程序一起使用 . 运行:

    sudo apt-get install php5-mysql
    

    安装了旧驱动程序,它又开始工作了 . 接近我可以弄清楚的是,它没有通过对等名称验证连接到RDS . 我不知道如何解决这个问题,并且因为它使用PHP流进行连接,所以设置似乎并不重要 .

    这是一个已知的错误:

    https://bugs.php.net/bug.php?id=68344

    所以我写了这个方法,从这里修改:How to know if MySQLnd is the active driver?

    public function getMySQLIType()
    {
        $mysqlType = [
            'mysql' => false,
            'mysqli' => false,
            'mysqlnd' => false,
        ];
    
        if (function_exists('mysql_connect')) {
            $mysqlType['mysql'] = true;
        }
    
        if (function_exists('mysqli_connect')) {
            $mysqlType['mysqli'] = true;
        }
    
        if (function_exists('mysqli_get_client_stats')) {
            $mysqlType['mysqlnd'] = true;
        }
    
        return $mysqlType;
    }
    

    如果数组为mysqlnd返回true,则禁用SSL . 如果返回false,则启用它 . 到目前为止,它的确有效 . 是的,这是一个黑客修复,但我不知道如何合法地解决这个问题 .

相关问题