2016-08-02 53 views
1

我們在端口3306上有一臺帶有mysql的服務器。我們有證書和密鑰,我們嘗試連接到這臺服務器。但我們看到這樣的問題:php 5.x 7.x,ssl pdo錯誤:對等證書CN =`someName'與預期不符CN ='someIP'

Peer certificate CN='SomeName' did not match expected CN='someIP'

我讀過很多文章,找不到PDO PHP的答案。最有趣的是,SQLYog可以連接所有設置。

我讀過我可以禁用verify_peer_names(我希望我明白什麼是peer_names ...),但只有當我們使用openssl_ {functions}或mysqli,而不是PDO。這兩種選擇都不適合我。我需要PDO。

我嘗試做:PHP的版本之間

  • 開關。它幫助了我,但我需要5.6或更高。對於PHP 7.0相同的錯誤。
  • 找到另一個版本的openssl和pdo;快我明白,它的一個壞主意:)
  • 在php.ini找到一些設置,但沒有設置我的問題,只爲創建ssl。

我的連接代碼:

$dbInfo = array 
(
'dsn' => 'mysql:host=123.45.67.890;dbname=someDB;port=3306', 
'user' => 'user', 
'pass' => 'userpassword' 
); 

$con = new PDO 
    (
    $dbInfo['dsn'], $dbInfo['user'], $dbInfo['pass'], 
    array(
     PDO::MYSQL_ATTR_SSL_CIPHER => 'AES256-SHA', 
     PDO::MYSQL_ATTR_SSL_CA  => 'SSLCert/ca-cert.pem', 
     PDO::MYSQL_ATTR_SSL_KEY => 'SSLCert/client-key.pem', 
     PDO::MYSQL_ATTR_SSL_CERT => 'SSLCert/client-cert.pem', 
    ) 
    ); 

echo 'Connection OK!'; 
+1

這是一個已知的問題,請參閱:[php bug#71003](https://bugs.php.net/bug.php?id=71003) –

+2

謝謝! 但我仍然不明白我與ssl連接有什麼關係。我讀到他們在一些補丁中修復了它們,他們挖掘了openssl庫,但首先我不擅長在lib中挖掘,其次 - 自己修復lib並不是一個好主意。也許我是carelles,沒有找到答案......如果你爲自己工作並解決了這個問題 - 你能不能告訴我該怎麼做? –

回答

1

我們得到了它不使用IP地址,但機(+域)的名稱爲CN和連接設置我們內部的自簽名證書的工作。

因此,將'dbServer1.company.local'作爲服務器證書的CN,並使用相同的'dbServer1.company.local'地址作爲PDO連接的DSN的主機部分。如果你喜歡,你可以使用'dbServer1',但確保你在兩個地方使用它。

這將讓你去:

$pdo_options = 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/ca.pem' 
); 

PDO::__construct('mysql:host=dbServer1.company.local;dbname=someDB','someUser', 'somePass', $pdo_options); 

我們管理我們自己的DNS解析,以便爲dbServer1.company.local不是一個問題,但如果你的網絡服務器無法解析它,你或者你不/不能管理DNS條目,那麼類似下面的技巧你etc/hosts文件:

10.5.5.20 dbServer1.company.local 

10.5.5.20 dbServer1 
+0

我不能說你是對的或者你錯了,因爲我沒有保留這個項目半年。但我認爲你說的是​​正確的事情。 –

+0

我爲訪問該頁面的其他人寫了這個答案。我猜你現在已經搬家了。 – PadraigD

+0

當然繼續! :)我只是寫我不能檢查你寫的東西。 –

相關問題