【问题标题】:PDO SSL - Strange BehaviorPDO SSL - 奇怪的行为
【发布时间】:2015-07-05 05:36:48
【问题描述】:

我正在尝试使用 PHP PDO 和提供的客户端证书连接到 Amazon RDS 上的 MySQL 数据库。实际证书位于:
var/www/includes/database/certs/cert.pem

我正在设置 SSL 属性:

$dbh = new PDO('mysql:host=example.com;dbname=example', username, password,  array(
                    PDO::MYSQL_ATTR_SSL_CERT=>'/var/www/includes/database/certs/cert.pem'
              ));

var_dump($db->query("SHOW STATUS LIKE 'Ssl_cipher';")->fetchAll());

/* Output */
#array(1) {
#  [0]=>
#  array(4) {
#    ["Variable_name"]=>
#    string(10) "Ssl_cipher"
#    [0]=>
#   string(10) "Ssl_cipher"
#    ["Value"]=>
#    string(10) "AES256-SHA"
#    [1]=>
#    string(10) "AES256-SHA"
#  }
#}

这使它看起来像它的工作。 但是,如果我将属性更改为不正确的路径,例如/var/www/includes/database/a,我仍然会得到相同的密码输出,并且没有错误。很奇怪。现在目录/var/www/includes/database/a 不存在。当我创建那个文件夹a 并运行上面的脚本时,我终于得到了 SSL 错误:

#PHP Warning:  PDO::__construct(): Unable to set local cert chain file `/var/www/includes/database/a'; Check that your cafile/capath settings include details of your certificate and its issuer in /var/www/includes/database/db_connect.php on line 11
#PHP Warning:  PDO::__construct(): failed to create an SSL handle in /var/www/includes/database/db_connect.php on line 11
#PHP Warning:  PDO::__construct(): Cannot connect to MySQL by using SSL in /var/www/includes/database/db_connect.php on line 11
#PHP Warning:  PDO::__construct(): [2002]  (trying to connect via tcp://example.com:3306) in /var/www/includes/database/db_connect.php on line 11
#PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] ' in /var/www/includes/database/db_connect.php:11
  • 为什么它似乎与一个不存在的目录正确连接?
  • 为什么在我真正创建了那个目录之后才抛出错误?
  • 如何确定 PDO 是通过 SSL 连接的(除了 wireshark)

【问题讨论】:

    标签: php mysql ssl pdo


    【解决方案1】:

    我想我会为此提供一些输入,因为在尝试将 MySQL 客户端从 Ubuntu linux 连接到 AWS RDS MySQL 实例时,我在底部有相同的 SSL 错误消息。我复制了 AWS 页面上的说明,并说了几句话:

    您的问题:“我如何确定 PDO 是通过 SSL 连接的(除了wireshark)?”

    您可以对 MySQL 用户帐户设置要求,如下所示:

    上授予使用权限。 TO 'username'@'%' REQUIRE SSL;

    如果您使用默认 PDO 连接说明,请确保您没有包含所有 key/cert/ca 语句。对于 AWS RDS MySQL,您只使用 CA 语句(类似于使用 Sequel Pro GUI 时所做的):

    <?php
    $pdo = new PDO(
        'mysql:host=hostname;dbname=ssldb',
        'username',
        'password',
        array(
            PDO::MYSQL_ATTR_SSL_CA    =>'/etc/mysql/ssl/rds-combined-ca-bundle.pem'
        )
    ); 
    

    【讨论】:

    • 很高兴知道如何通过用户帐户确保与 MySQL 的安全连接。这个问题对我来说不再相关,但我仍然觉得它在无效证书路径方面的运作方式很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多