2015-07-11 89 views
2

我試圖將PHP mysqli連接設置爲兩個VPS服務器的MariaDB數據庫,並且需要加密通信,因爲它在公共網絡上。通過SSL的Mysql連接使用PHP mysqli

目前我可以通過命令行mysql客戶端正常連接從客戶端服務器到數據庫服務器,我通過tcpdump檢查連接是否加密。但由於某種原因,我無法弄清楚PHP部分。這是相對基本的nginx + php5-fpm + mariadb設置,但mysql正在使用非默認端口。 Debian的傑西,5.6.7的php5,MariaDB的10.0.16,nginx的1.6.2

這裏的測試腳本:

<?php 
     $DB_NAME = ''; 
     $DB_HOST = '111.111.111.111'; 
     $DB_USER = 'username'; 
     $DB_PASS = 'password'; 

$mysqli = mysqli_init(); 
if (!$mysqli) { 
    die('mysqli_init failed'); 
} 
//have tried witha and without the following with multiple variations 
$mysqli->ssl_set(NULL, NULL, NULL,'/etc/mysql/ssl/',NULL); 
if (!$mysqli->real_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME, 11111, NULL,MYSQLI_CLIENT_SSL)) { 
    die('Connect Error (' . mysqli_connect_errno() . ') ' 
      . mysqli_connect_error()); 
} 
     $query = "SHOW STATUS LIKE 'ssl_cipher'"; 
     $result = $mysqli->query($query) or die($mysqli->error.__LINE__); 
     if($result->num_rows > 0) { 
       while($row = $result->fetch_assoc()) { 
         print_r($row); 
       } 
     } 
     else { 
       echo 'NO RESULTS'; 
     } 
     mysqli_close($mysqli); 
?> 

主要錯誤我越來越沒有ssl_set:

2015/07/11 15:58:34 [error] 2857#0: *374 FastCGI sent in stderr: "PHP message: PHP Warning: mysqli::real_connect(): SSL operation failed with code 1. OpenSSL Error messages: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): Cannot connect to MySQL by using SSL in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): [2002] (trying to connect via tcp://192.168.130.123:42139) in /srv/www/test.php on line 15 
PHP message: PHP Warning: mysqli::real_connect(): (HY000/2002): in /srv/www/test.php on line 15"..... 

任何想法,將不勝感激。這真的讓我失望。

回答

2

可能出現此問題是由於在PHP 5.6中所做的更改。我猜你正在使用自簽名證書?如果您的數據庫通過DEFAULT啓用了peer_name驗證,則無法在PHP中禁用此功能。因此,當生成證書時,您必須爲每個證書使用正確的「公用名稱」:

CA:主機名稱 服務器:FQND,例如, hostname.example.com 客戶端:somename

重要的部分是服務器證書,其中通用名稱必須與您要連接的主機相同。

+0

正確。然而,目前還有一個開放的bug,這顯然使得使用SSL和mysqlnd與自簽名證書無法使用SSL:https://bugs.php.net/bug.php?id = 68344 我想我現在要去autossh land。 ..至少應該工作。 – Tuxie

1

看起來這是什麼

SSL3_GET_SERVER_CERTIFICATE:證書驗證失敗

我的猜測是,你沒有正確的CA成立做。一些數據庫系統(如Amazon Web Services RDS)具有自己的CA文件。您正在使用capath參數,因此請確保PEM文件位於該路徑中。如果是這樣,接下來的事情我會做的是切換到the third argument of ssl_set並指定PEM文件直接

$mysqli->ssl_set(NULL, NULL, '/path/to/ca.pem', NULL, NULL); 
+0

謝謝。我曾嘗試過使用ssl_set,以便我直接指定文件,並且僅使用路徑而不使用整個ssl_set ...沒有骰子。另外因爲PHP應該使用mysql客戶端,而且mysql客戶端已經測試過了,所以我不明白爲什麼php會突然抱怨CA問題。 mysqli客戶端不使用mysql客戶端,而是使用其他的東西嗎? – Tuxie

+0

@Tuxie取決於你的配置。有些服務器仍然使用mysql-client連接到MySQL,而其他服務器使用mysqlnd(這是首選)。如果可以的話,去[MySQL Workbench](http://dev.mysql.com/downloads/workbench/)並嘗試以這種方式連接到你的服務器(假設你可以從你的桌面訪問它)。它使用相同的SSL連接選項,並可能告訴你是否有其他錯誤。 – Machavity

+0

感謝您的想法。我想我將不得不詳細檢查一下mysqlnd。到目前爲止,我認爲它會使用mysql客戶端,但它可能會做一些完全不同的事情。 – Tuxie