php - 使用无证书的 --ssl 使用 PHP PDO 连接到 MySQL/MariaDB

标签 php mysql ssl pdo mariadb

我可以从 Sequel Pro(参见 this post)和控制台连接到 MySQL/MariaDB通过提供没有任何证书的 --ssl 选项:

$ mysql -u myusername -p -h 10.123.45.67 --ssl
Enter password:
Welcome to the MariaDB monitor.

没有 --ssl 的连接是不可能的,因为用户需要 SSL:

$ mysql -u myusername -p -h 10.123.45.67
Enter password:
ERROR 1045 (28000): Access denied for user 'myusername'@'10.123.45.67' (using password: YES)

我如何在 PHP 中使用 PDO 实现相同的目的?

我研究了过去几个小时,但没有找到解决方案。我尝试修改提供给 PDO 构造函数的 dsn 和选项参数,但没有成功。我要么以错误代码 1045(拒绝访问)或 2002(无法通过套接字连接)结束:

$pdo = new PDO('mysql:dbname=...;host=10.123.45.67;port=3306', 'myusername', '...');

PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'myusername'@'10.123.45.67' (using password: YES)

添加 PDO::MYSQL_ATTR_SSL_KEY(和其他)作为 PDO 构造函数的选项,导致 2002(这些选项没有意义,因为我没有 key 等)。虽然我不知道如何以与从控制台或在 Sequel Pro 内部完成的方式相同的方式设置连接。

最佳答案

通过设置传递给 PDO 构造函数的选项,我能够在不启用客户端证书身份验证的情况下启用 SSL 连接。我将 CA 设置为 true 并关闭了服务器证书验证:

$options = [
    PDO::MYSQL_ATTR_SSL_CA => '/dev/null',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];

如果你想验证服务器证书,那么你需要将 CA 设置为一个包含真实 CA 证书链的文件(尽管如果你使用的是 Azure MySQL 实例,这目前是不可能的 - 你总是需要禁用服务器证书验证,因为 PDO 不遵循 CNAME 记录,但那是 another issue entirely )。

这适用于 PHP 7.3。不确定早期版本的 PHP。

编辑 事实证明,只要您禁用服务器验证,PDO::MYSQL_ATTR_SSL_CA 就会被完全忽略。你仍然必须将它设置为非空的东西:

$options = [
    PDO::MYSQL_ATTR_SSL_CA => true,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
];

关于php - 使用无证书的 --ssl 使用 PHP PDO 连接到 MySQL/MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46895960/

相关文章:

mysql - 如果在命令行中使用,如何创建 mysql 数据库备份

c# - SSL 连接异常

php - 如何在 laravel 5.8 中错误地设置外键约束

php - Service unavailable 服务暂时不可用错误

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解要使用的正确语法

php - 无法更改 Laravel 查找 PostgreSQL SSL 证书的位置

ssl - Kubernetes:cert-manager 证书处于待处理状态

php - Mysql 数据在选择列表中的单引号后被截断

mysql - 将文本文件导入 MySQL WorkBench。语法错误

php - 在 php-activerecord 中使用 `query()` 方法的查询在迁移时是否有效?