【问题标题】:php script fails to connect to MySQL with SSLphp 脚本无法使用 SSL 连接到 MySQL
【发布时间】: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 中使其工作。我不明白为什么这会有所作为,但现在可以了!。

标签: php mysql ssl


【解决方案1】:

我已经解决了这个问题 - 感谢所有帮助过的人。这是我学到的:

  • SSL 密钥是连接类型特定的 - 所以我有与 ODBC 一起使用的密钥,但期望它们与 PDO 一起使用是错误的
  • ODBC 驱动程序(php 扩展)需要安装在服务器上 - 它们不会自动出现。 Here 是一个很好的视频,展示了如何做到这一点。
  • 您需要对服务器进行命令行访问才能安装驱动程序(并将 SSL 密钥上传到安全位置) - 它们位于 /etc/mysql/ssl。
  • 我将驱动程序安装在 /usr/lib/odbc2/lib 而不是视频中的长文件夹名称中。我还在 /usr 树 中安装了它,因为当我尝试视频中的位置时,我得到了文件未找到错误。这两个驱动文件是 libmyodbc5a.so 和 libodbc5w.so。似乎只需要 ...5w.so 文件。
  • 一旦这些文件就位,那么您需要在 /etc 文件夹中的 odbcinst.ini 中添加一个条目。我使用了 nano,所以命令行 nano odbcinst.ini 会调出具有 PostgresSQL 模型条目的文件。如果服务器是 64 位,那么这些是我在 odbcinst.ini 中创建的条目: [mysql537] Driver64 = /usr/lib/odbc2/lib/libmyodbc5w.so Setup64 = /usr/lib/odbc2/lib/libmyodbc5w.so 使用次数 = 1

  • 您必须具有 ...64 路径,否则找不到驱动程序(即 Driver64 = NOT Driver= )。我首先犯了这个错误。

  • 如果在 odbcinst.ini 的路径中找到驱动程序文件,那么一切都会正常。 (我以为我需要 odbc.ini 中的条目,但我现在相信只有在使用 DSN 时才需要这里的内容)。
  • odbc2 文件夹是我在 /etc/lib 中创建的文件夹,它已经存在。我这样做是为了通过创建一个新文件夹来避免任何权限问题。

这是有效的代码(连接字符串与 Microsoft Access 连接中使用的字符串完全相同):

<?php
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', '1');
error_reporting (E_ALL|E_STRICT);

$user = "odbcmmm";
$pass = "999999999";

$connection = "Driver={mysql537};Server=99.99.199.199;Database=db_name;UID=odbc_db_name;PWD=password;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);

$sql="SELECT Id from stk_item"; 
$rs=odbc_exec($con,$sql);

if (!$rs)   {
exit("Error in SQL");
}

我希望这是有用的。

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2019-03-25
    • 2015-09-29
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多