首页 > 解决方案 > 是否可以使用 SSL 但没有客户端证书将 PHP PDO 连接到远程 MySQL

问题描述

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

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

标签: phppdo

解决方案


从下载证书

wget --no-check-certificate https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem

pdo 连接代码看起来像

    $options = array(
   PDO::MYSQL_ATTR_SSL_CA => '/path to crt file /DigiCertGlobalRootCA.crt.pem',
   PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
);
$dsn = "mysql:host=$host;port=$port;dbname=$db_name";

try {
     $pdo = new \PDO($dsn, $username, $password, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

mysql连接看起来像

//Initializes MySQLi
$conn = mysqli_init();

mysqli_ssl_set($conn,NULL,NULL, "/path to crt file /DigiCertGlobalRootCA.crt.pem", NULL, NULL);
mysqli_real_connect($conn, $host, $username, $password, $db_name, $port, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);

//OR//
mysqli_real_connect($conn, $host, $username, $password, $db_name, 3306, NULL, MYSQLI_CLIENT_SSL);


//If connection failed, show the error
if (mysqli_connect_errno())
{
    die('Failed to connect to MySQL: '.mysqli_connect_error());
}

推荐阅读