2014-04-28 190 views
2

我們通過創建證書,更新my.cnf,創建具有正確權限的用戶並需要ssl,重新啓動服務並驗證它是否有效服務器端和客戶端(通過mysql命令行)通過遠程連接。我也驗證了PDO能夠在完全相同的設置下正常工作,但在mysql中禁用用戶帳戶中的「require ssl」,因爲它只是靜默地失敗並使用非ssl連接。無法使用ssl連接PDO,但使用ssl連接到mysqli

但是,使用PHP應用程序進行連接時,使用PDO強制ssl無法正常工作,但使用強制ssl使用mysqli可以正常工作。我認爲他們使用相同的驅動程序,兩者都應該正常工作。我得到的錯誤消息是'失敗連接到數據庫[SQLSTATE [2800] [1045]拒絕訪問用戶',但用戶存在,並且此連接與mysqli(force ssl)一起使用,只有當我刪除'在mysql中需要用戶的ssl'。

PHP 5.5.9 CentOS版本6.5(最終) PDO_MYSQL 31年5月5日

讓我知道如果我可以提供任何其他信息。下面是連接示例,

//mysqli 
$conn=mysqli_init(); 
mysqli_ssl_set($conn, $clientkey, $clientcert, $sharedca, NULL, NULL); 
if (!mysqli_real_connect($conn, $host, $user, $pass, $db)) 
{ 
    die("Failed connecting to ssl mysql via mysqli"); 
} 

$res = mysqli_query($conn, "SHOW STATUS like 'Ssl_cipher'"); 
print_r(mysqli_fetch_row($res)); 
mysqli_close($conn); 

//pdo 
$options = array_merge($options, array(
PDO::MYSQL_ATTR_SSL_KEY   => $sslkey, 
PDO::MYSQL_ATTR_SSL_CERT   => $sslcert, 
PDO::MYSQL_ATTR_SSL_CA   => $sslca, 
)); 

try 
{ 
    $pdo = new PDO("mysql:dbname={$db};host={$host}", $user, $pass, $options); 
} 
catch(PDOException $e) 
{ 
    die("Failed connecting"); 
} 

有什麼我應該知道如何正確使用SSL與PDO連接?或者我不得不切換到mysqli,因爲PDO對SSL的支持可能有問題?

謝謝。

+0

檢查這個,它可能會幫助http://stackoverflow.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php –

+0

已經引用這個帖子,這些例子說明我是如何已經連接起來,沒有概念證明,只是從文檔中提取可能。我想在它下面沒有正確連接通過ssl所有這就是爲什麼我被阻止,也許我會看看源代碼,並嘗試像Xdebug如果可能的話。 – user3581488

+0

我知道這是舊的,但..我堅持與完全相同的問題!命令行+ mysqli工作得很好,但PDO返回「訪問被拒絕」。請告訴我,你找到了一個解決方案,你記得它...... – Delphine

回答

0

下面的代碼將解決問題,
新PDO( 'MySQL的:主機='。HOST '; DBNAME =' DBNAME ';字符集= UTF8',用戶名,密碼, 陣列( PDO :: MYSQL_ATTR_SSL_KEY =>'/ mysqlsslcertificate1/client-key.pem', PDO :: MYSQL_ATTR_SSL_CERT =>'/ mysqlsslcertificate1/client-cert.pem', PDO :: MYSQL_ATTR_SSL_CA =>'/ mysqlsslcertificate1/ca-cert.pem ' ) );

+0

這與上面提供的編碼示例有何不同?看起來相同...請澄清。 – user3581488

+0

@ user3581488我們需要ssl pem文件的路徑,而不僅僅是文件的名稱 – Elby

+0

我們的兩個編碼示例都需要完整路徑,所以mysqli和pdo無法解決此問題。所以這在原來的post/code例子中沒有改變。 – user3581488

0

實際的問題是服務器證書CN驗證(不匹配),但報告的錯誤是PDOException: SQLSTATE[HY000] [2002]

有許多蟲子在PHP中記錄了這一問題,如:7184571003Github PR

的解決方案是這樣無證這些PHP版本 22年6月5日(不知道)後屬性可用,7.0.18(驗證)和7.1.15(不知道)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

可能的值:true和false 默認值:真

使你的代碼看起來應該像

$pdo = new PDO('mysql:host=XXXXXX;dbname=XXXXXX', 'XXXXXX', 'XXXXXX', array(
    PDO::MYSQL_ATTR_SSL_KEY =>'/path/to/client-key.pem', 
    PDO::MYSQL_ATTR_SSL_CERT =>'/path/to/client-cert.pem', 
    PDO::MYSQL_ATTR_SSL_CA  =>'/path/to/server-ca.pem', 
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false 
) 

);