【问题标题】:Is it possible to connect PHP PDO to remote MySQL with SSL but without client certificate是否可以使用 SSL 但没有客户端证书将 PHP PDO 连接到远程 MySQL
【发布时间】:2019-07-15 22:33:42
【问题描述】:

如果我正确理解这个远程 MySQL 服务器有服务器证书来验证客户端并加密连接。 并且客户端可以有客户端证书来向服务器进行身份验证,但是如果我不需要向服务器验证客户端,因为我只需要加密,我可以在创建 PDO 连接时省略客户端证书。

例如,它的语法是什么 $con = new PDO('mysql:host=someHost;dbname=someDB;port=3306',$user,$pass);
在哪里指定我想要 SSL 但没有客户端证书

【问题讨论】:

  • 那么 SSL 端点 MySQL 服务器没有证书?
  • 你需要一个客户端证书,但是它们是免费的
  • $options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::MYSQL_ATTR_SSL_CA => '/path/to/cacert.pem', ... $con = new PDO(' .. $options)
  • @Jay,端点 MySQL 服务器有证书,但我有 PDO 的客户端没有证书。我没有在命令中指定 '/path/to/cacert.pem' 的那个文件。有必要吗,我在某处读到“不需要客户端证书,除非您为帐户设置 REQUIRE X509 选项”
  • 那是因为您提供的用户没有访问权限。是Access denied for user something@localhost吗?

标签: php pdo


【解决方案1】:

这就是我设法与 PDO 连接的方式

$conn = new PDO('mysql:host=myServer;dbname=MyDb',
                $user,
                $pass,
                array(PDO::MYSQL_ATTR_SSL_CA     => '/etc/ssl/certs/anyOneOfTheMilionCertsFromHere.pem',
                      PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/')
              );

我不知道为什么,但如果我没有在“PDO::MYSQL_ATTR_SSL_CA”中指定 .pem 文件,它就不起作用,它可以是任何 .pem 文件,例如 Deutsche_Telekom_Root_CA_2.pem、Baltimore_Cyber​​Trust_Root.pem,...会工作的。

这就是我如何使用 MYSQLI 做到的, 只是优雅地告诉它我想要带有常量“MYSQLI_CLIENT_SSL”的 SSL,而不指定一些随机的 .pem 文件

$mi = mysqli_init();
$conn = mysqli_real_connect($mi, $server, $user, $pass, $db, 3306, NULL, MYSQLI_CLIENT_SSL) or die(mysqli_connect_error());

这是否可以在不明确指定 .pem 文件的情况下使用 PDO(如正常)来完成?

【讨论】:

  • 您确定 mysqli 示例确实是通过 SSL 连接的,还是回退到非 SSL 连接?我尝试过这种方式,但 PHP 中的 SHOW STATUS LIKE 'Ssl_cipher' 返回空字符串 - 所以它实际上并没有通过 SSL 连接;而在 mysql 命令行中,Ssl_cipher 按预期返回DHE-RSA-AES128-GCM-SHA256
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 2012-08-25
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多