PHP到MySQL的SSL连接

PHP到MySQL的SSL连接,php,mysql,ssl,mysqli,Php,Mysql,Ssl,Mysqli,我已经成功地在一个网络上的一台服务器上安装了启用SSL的MySQL,并且可以通过不同网络上不同服务器上的Linux命令行MySQL客户端使用SSL进行连接,但是每次尝试连接(使用PHP 5.3.3)时,我都会得到: 警告:mysqli_real_connect():(HY000/2026):第18行的/var/www/html/test.php中存在SSL连接错误 我的PHP如下:我做错什么了吗?证书为777(仅在测试时),相同的代码适用于不同用户的未加密连接(带有注释的SSL设置,即mysql

我已经成功地在一个网络上的一台服务器上安装了启用SSL的MySQL,并且可以通过不同网络上不同服务器上的Linux命令行MySQL客户端使用SSL进行连接,但是每次尝试连接(使用PHP 5.3.3)时,我都会得到:

警告:mysqli_real_connect():(HY000/2026):第18行的/var/www/html/test.php中存在SSL连接错误

我的PHP如下:我做错什么了吗?证书为777(仅在测试时),相同的代码适用于不同用户的未加密连接(带有注释的SSL设置,即
mysqli
肯定可以连接到数据库)


也许您的php版本用作传输驱动程序,但它不支持ssl(还?)。
什么是

<?php
error_reporting(E_ALL);
ini_set("display_errors", "1");
echo 'version: ', phpversion(), "\n";
echo function_exists('mysqli_fetch_all') ? 'mysqlnd' : '--', "\n";
这里PHP(和
mysqli\u real\u connect
)是客户端而不是服务器。您正在使用
mysqli\u ssl\u set
对其进行配置,以进行客户端证书身份验证(并使用服务器密钥和证书)

我不确定您是如何配置MySQL服务器的,但在配置的(MySQL)服务器部分应该有类似的内容:

ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem
这些证书无论如何都不属于客户端(只有CA证书属于客户端,但绝对不属于服务器的私钥)

完成此操作后,您可以尝试使用命令行客户端查看服务器配置是否正确:

mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
或者可能是这样(尽管应该真正启用验证服务器证书以使SSL/TLS有用)

这至少应该在命令行上起作用

然后,从PHP中,您可以获得两个选项:

  • 像以前一样使用
    mysqli\u ssl\u set
    ,但将
    $key
    $cert
    保留为空,除非您希望使用的客户端证书确实应该与服务器证书不同。(我不记得这是否有效。)
  • 可能更简单,完全省略
    mysqli\u ssl\u set
    ,并在全局MySQL客户端配置文件中进行配置(PHP应该能够在该文件中拾取它,可能是
    /etc/MySQL/my.cnf
    ,但这可能因您的发行版而异):

(这与服务器配置类似,但位于客户端/客户端部分。)

对于授权部分(
GRANT
):

  • 需要SSL
    只需要使用SSL/TLS
  • 要求颁发者
    要求主体
    要求X509
    要求客户端提供客户端证书,以与所需值进行比较(在这种情况下,您需要在客户端(配置或在
    mysqli_ssl_集
    内)使用
    ssl密钥
    ssl证书

如果您使用的是5.7.3之前的MySQL和标准PHP库,请务必小心:

在MySQL 5.7.3之前,--ssl允许但不要求客户端 使用SSL连接到服务器。因此,此选项不可用 本身足以导致使用SSL连接。对于 例如,如果为客户端程序指定此选项,但 服务器尚未配置为允许SSL连接,存在 使用未加密的连接

对于PHP,如果服务器无法支持SSL,MySQL将自动失败


注意:这是localhost,因为我现在也在本地机器上尝试它,所以我100%确定这不是防火墙问题-我在那里也遇到了相同的错误…不-我知道它们在一个奇怪的位置,但是在/中有一个有效的文件夹,它被命名为777,用于测试MySQL服务器的错误日志中是否有可能相关的内容?如果可能的话用--log warnings=2(或3或99,某物>1)启动MySQL服务器,请顺便说一句:您使用的MySQL版本是什么?可能是关于您的系统的一些其他说明?例如,OS版本,这些证书是如何创建的…不知道这是否相关,但可能是…(您还应该在客户端配置中启用
ssl verify server cert
)我现在已经开始工作了,大部分已经按照前面提到的那样设置好了,但是我喜欢[客户端]想法-没有想到。证书的生成是按照mysql手册页中的说明进行的,但奇怪的是,只有在我只在mysqli连接中设置ca变量并将其设置为server-cert.pem时,来自PHP的连接似乎才起作用。知道为什么吗?这里是[mysqld]的ssl位ssl=1 ssl ca=/mysql ssl certs/ca-cert.pem ssl capath=/mysql ssl certs ssl cert=/mysql ssl certs/server-cert.pem ssl key=/mysql ssl certs/server-key.pem感谢您的授权备注。我使用了REQUIRE ssl:建立了ssl连接,但忽略了所有本地证书。设置REQUIRE X509后,至少需要客户端密钥和cert文件是必需的。我遇到了这个确切的问题。我设置了
mysqli\u ssl\u集($db,null,null,/path/to/ca-cert.pem',null,null)
到ca-cert.pem,但是得到了
警告:mysqli\u real\u connect():在第31行的/MySQLConnection.php中找不到对等证书CN
请注意,my.cnf解决方案只能在php中工作
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
[client]
ssl-ca=/mysql-ssl-certs/ca-cert.pem