簡體   English   中英

PHP PDO SSL MySQL連接失敗

[英]PHP PDO SSL MySQL connection fails

我正在嘗試開發一個使用SSL連接到MySQL服務器的PHP應用程序。 我嘗試使用mysql_connect並可以正常工作,但使用PDO卻不能。 當我嘗試連接時,出現以下錯誤:

PDO :: __ construct():此流不支持SSL /加密

看起來很奇怪的是,如果我調整證書路徑(指向不存在的文件),則會遇到相同的錯誤!

我在Debian Squeeze上使用php 5.3.10,安裝了以下軟件包:

php5-cgi 
php5-cli
php5-common
php5-fpm
php5-gd
php5-mcrypt
php5-mysql
php5-suhosin

任何的想法? 謝謝

您需要刪除php-mysql並安裝php-mysqlnd。 在Centos上:

sudo yum remove php-mysql
sudo yum install php-mysqlnd
sudo yum reboot

Ubuntu / Debian的

sudo apt-get remove php5-mysql
sudo apt-get install php5-mysqlnd
sudo reboot

mysqli程序:

$con=mysqli_init();
if (!$con)
  {
  die("mysqli_init failed");
  }

mysqli_ssl_set($con,'/ssl/client-key.pem','/ssl/client-cert.pem', '/ssl/ca.pem',NULL,NULL);

if (!mysqli_real_connect($con,'xx.xxx.xxx.xxx', 'user', 'pass' ,'dbname'))
  {
  die("Connect Error: " . mysqli_connect_error());
  }

mysqli_close($con);
?>

PDO

$ssl = array(
                PDO::MYSQL_ATTR_SSL_KEY    =>'/ssl/client-key.pem',
                PDO::MYSQL_ATTR_SSL_CERT=>'/ssl/client-cert.pem',
                PDO::MYSQL_ATTR_SSL_CA    =>'/ssl/ca.pem'
        );
        try {
                $dbl = new PDO("mysql:host=$host;dbname=$database", $user, $password, $ssl);
                $dbl->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
echo $e->getMessage();
die;
        }

您的證書路徑必須正確。 在SSL中嘗試此操作,以確保文件在那里:

if(file_exists('/ssl/client-key.pem') && file_exists('/ssl/client-cert.pem') && file_exists('/ssl/ca.pem')) echo 'file exists';

遠程主機(數據庫服務器)還必須啟用SSL。 運行查詢

SHOW VARIABLES LIKE '%ssl%';

輸出:

+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| have_openssl  | YES                  |
| have_ssl      | YES                  |
| ssl_ca        | /ssl/ca.pem          |
| ssl_capath    |                      |
| ssl_cert      | /ssl/server-cert.pem |
| ssl_cipher    | DHE-RSA-AES256-SHA   |
| ssl_key       | /ssl/server-key.pem  |
+---------------+----------------------+

如果禁用,它將無法正常工作。 您的/etc/my.cnf(或my.cnf所在的位置)必須包含:

ssl-ca=/ssl/ca.pem
ssl-cert=/ssl/server-cert.pem
ssl-key=/ssl/server-key.pem
ssl-cipher=DHE-RSA-AES256-SHA

生成密鑰的MySQL資源: http : //dev.mysql.com/doc/refman/5.0/en/creating-ssl-files-using-openssl.html

最后,DHE密碼不再被認為是安全的。 密碼一直在被破壞,因此您必須找出今天被認為安全的密碼。

您的模塊列表不包括include openssl

您可以使用php -m檢查編譯的模塊。 您可以通過運行php -a然后執行var_dump(get_loaded_extensions());來檢查運行時加載的所有模塊var_dump(get_loaded_extensions());

您需要將其編譯或作為擴展加載,以使用SSL連接。

如果磁盤上存在擴展(檢查你的php擴展目錄-在位置php.ini ),那么也請檢查您php.ini的線路extension=php_openssl.so並確保它沒有被注釋掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM