当前位置: 首页 > 知识库问答 >
问题:

SSL上的PHP MySQL。对等证书不匹配

毋树
2023-03-14

我正在尝试从GCE(Google Compute Engine)实例使用Google Cloud SQL over SSL。我的问题是无法通过SSL连接到云SQL实例。

mysql命令工作正常。我可以用认证文件连接到云SQL实例。

mysql -uroot -p -h [IP Address] --ssl-ca=/home/user/.cert/server-ca.pem --ssl-cert=/home/user/.cert/client-cert.pem  --ssl-key=/home/user/.cert/client-key.pem
<?php
$pdo = new PDO('mysql:host=[IP Address];dbname=testdb', 'root', 'test', array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/home/user/.cert/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT=>'/home/user/.cert/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/home/user/.cert/server-ca.pem'
    )
);
$stmt = $pdo->query("SHOW TABLES;");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
?> 
PHP Warning:  PDO::__construct(): Peer certificate CN=`[GCP project name]:[Cloud SQL instance name]' did not match expected CN=`[IP Address]' in /tmp/mysql.php on line 7
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] ' in /tmp/mysql.php on line 7

我在使用mysqli时也犯了同样的错误。

$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);

$mysqli->ssl_set('/home/user/.cert/client-key.pem',
                 '/home/user/.cert/client-cert.pem',
                 '/home/user/.cert/server-ca.pem',
                  NULL,NULL);

$mysqli->real_connect('[IP Address]', 'root', 'test', 'testdb', 3306, NULL, MYSQLI_CLIENT_SSL);

这是一个很好的例子

PHP Warning:  mysqli::real_connect(): Peer certificate CN=`[GCP project name]:[Cloud SQL instance name]' did not match expected CN=`[IP Address]' in /tmp/mysql3.php on line 30
Warning: mysqli::real_connect(): (HY000/2002):  in /tmp/mysql3.php on line 30

这个问题看起来和我的案子有关,但还没有答案。使用PHP与Mysql连接的SSL自签名认证

有人知道解决方案吗?

更新1

将报告该错误。https://bugs.php.net/bug.php?id=71003

在我使用mysqli时修复了它

我所做的如下:

1我将PHP更新到5.6.20

sudo apt-get install php5
$mysqli->real_connect('[IP Address]', 'root', 'test', 'testdb', 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);

这个错误报告显示了PDO的情况。听起来还没搞定。

https://bugs.php.net/bug.php?id=71845

最糟糕的是你们使用了不可能的CN名称(:)。如果CN没有冒号,也许我可以将ip和CN映射到我的主机文件中,这样当对等验证完成时,它就可以通过。使用冒号,php认为是主机,是端口

我理解目前通过IP连接时的情况并不理想。

但似乎他们提供了一种叫做“代理”的解决方案。

我使用的是Cloud SQL第二代,我的应用程序是由GCE托管的。所以我想我可以用代理的方式。我现在就试试。

在Ubuntu上安装代理

$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
$ mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
$ chmod +x cloud_sql_proxy
$ sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
$ ./cloud_sql_proxy -dir=/cloudsql -instances=<project name>:us-central1:mydb 

PDO

<?php
$pdo = new pdo('mysql:unix_socket=/cloudsql/<project name>:us-central1:mydb;dbname=testdb','root','test');
$stmt = $pdo->query("SHOW TABLES;");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
?>
$mysqli = mysqli_connect('localhost', 'root', 'test', 'testdb', 3306, '/cloudsql/<project name>:us-central1');
$sql = "SELECT id FROM users";
if ($result = $mysqli->query($sql)) {
    while ($row = $result->fetch_assoc()) {
        echo $row["id"] . "\n";
    }
    $result->close();
}
$mysqli->close();

参考文献(日文)

http://blog.hrendoh.com/connecting-to-google-cloud-sql-using-mysql-client/http://blog.hrendoh.com/google-appengine-php-using-cloud-sql/

共有1个答案

袁运良
2023-03-14
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
 类似资料:
  • 到目前为止我所做的步骤: 国家/地区名称:空 州或省名称:空 地区名称:空 组织名称:空 组织单位名称:空 通用名:localhost 电子邮件地址:空

  • 问题内容: 我在PHP 5.6上使用PHPMailer,围绕PHP 5.6中的证书提高的安全性当然很有趣。 我试图将测试消息发送到Dreamhost上托管的域,PHPMailer返回的错误是:无法连接到SMTP主机。 但是,该错误并不正确,我已启用日志记录,这是实际发生的情况。 连接:打开mx1.sub4.homie.mail.dreamhost.com:25,超时= 30,options = a

  • 我尝试用默认的amazon子域:some-unique-path.elb.amazonaws.com在ALB上配置https,问题是我找不到如何为该域生成ssl证书:amazon证书管理器不允许为amazonaws子域生成证书。有没有什么方法可以使它不购买自定义域和配置为ALB?

  • null openssl pkcs12-export-in cert1.pem-inkey privkey1.pem-out cert_and_key.p12-name certificate-cafile fullchain1.pem-caname root keytool-importKeystore-destStorePAS5W0RD123-destKeypass Pas5w0rd123-d

  • 对不起,我的错误,有两件事必须强调: 我正在尝试使用自签名证书作为HTTPS客户端证书。但是,存在一个问题“SSL:无法从对等证书获取公共名称” null 正在尝试127.0.0.1...已连接Enter PEM密码短语: 成功设置证书验证位置: cafile:/home/freeman/dev/git/ca_tools/ca_tools/ssl/ca/secure_ca.crt capath:/

  • 我被困在如何修复这个SSL错误上—— 我的SSL证书在Chrome上运行良好,但在Safari和Firefox上,如果我去www.domain.com而不是domain.com,就会出现主机名不匹配的错误 我已经使用Certbot为我的domain.com和www.domain.com域设置了SSL证书 当我在nginx上检查以确保证书存在时,我运行< code>sudo certbot - ng