【发布时间】:2019-07-20 07:44:16
【问题描述】:
以下脚本在 Centos 服务器上运行,并试图连接到另一个需要 SSL 参数的服务器上的 MySQL 数据库。脚本中使用的凭据使用 Microsoft Access DSN 连接可以正常工作。
<?php
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', '1');
error_reporting (E_ALL|E_STRICT);
$pdo = new PDO('mysql:host=99.99.199.199;dbname=dummy1', 'user1', 'pwd1',
array(
PDO::MYSQL_ATTR_SSL_KEY =>'/etc/mysql/ssl/ck.pem',
PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/cc.pem',
PDO::MYSQL_ATTR_SSL_CA =>'/etc/mysql/ssl/c1.pem'
));
$statement = $pdo->query("SHOW TABLES;");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
?>
上面的代码给出了 SSL 操作失败,代码 1 - 这是完整的消息:
致命错误:未捕获的 PDOException:PDO::__construct():SSL 操作 代码 1 失败。OpenSSL 错误消息:错误:14090086:SSL 例程:ssl3_get_server_certificate:证书验证失败 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php:10 堆栈跟踪:#0 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php(10): PDO->__construct('mysql:host=99.9...', 'odbc_guil...', 'pwd1', Array) #1 {main} Next PDOException: SQLSTATE[HY000] [2002] in /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php:10 堆栈跟踪: #0 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php(10): PDO->__construct('mysql:host=99.9...', 'odbc_guil...', 'pwd1' , Array) #1 {main} 投入 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php 在第 10 行
我已经验证了凭据,包括带有 DSN 连接的 SSL 参数。我已检查 SSL 密钥是否正确位于 /etc/mysql/ssl 目录中。
任何建议我做错了什么的帮助都会很好。谢谢。
我可能一直走错路...... 由于这些密钥可与 ODBC 一起使用,因此我认为我应该使用 odbc_connect 并发送与 MS 访问相同的字符串,例如
$user = "user";
$pass = "pwd";
$connection = "Driver={MySQL ODBC 5.1 Driver};Server=46.51.178.163;Database=db1;sslca=/etc/mysql/ssl/c1.pem;sslkey=/etc/mysql/ssl/ck.pem;sslcapath=/etc/mysql/ssl/;sslcert=/etc/mysql/ssl/cc.pem";
$con = odbc_connect($connection, $user, $pass);
但是要让它工作,我需要在我目前正在处理的服务器上安装一个 MySQL 连接器。
【问题讨论】:
-
证书,您是从提供商那里获得的,还是自己制作的?他们似乎没有得到验证。或者没有连接到验证服务器。
-
感谢 Anuga - 它们来自数据库提供商。
-
这没有帮助。您的连接字符串包含 SSL 设置,但它没有明确说明应该进行哪些验证 - 即您的 ODBC 连接可能没有使用 SSL?您是否尝试过使用 openssl 测试连接?
-
感谢 syncbean - 它肯定使用 SSL。我通过缩短驱动程序名称并将其放在 /usr 路径而不是 /root 中使其工作。我不明白为什么这会有所作为,但现在可以了!。