我可以从 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/