php脚本无法使用SSL连接到MySQL

时间:2019-02-26 17:27:44

标签: php mysql ssl

下面的脚本在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错误消息:error: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',   数组)#1 {main}下一个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' ,   数组)#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连接器。

1 个答案:

答案 0 :(得分:0)

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

  • 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] 驱动程序64 = /usr/lib/odbc2/lib/libmyodbc5w.so Setup64 = /usr/lib/odbc2/lib/libmyodbc5w.so UsageCount = 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");
}

我希望这是有用的。