簡體   English   中英

PHP與Mysql的Mysql連接無法正常運行PDO

[英]PHP Mysql connection with SSL is not working PDO

Mysql服務器正在運行php5.3。 新的webserver正在運行php7.1(從php5.3遷移)。 當我嘗試連接mysql服務器與ssl時,它無法正常工作。

try {
$dbh = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_SSL_KEY  => '/etc/mysql/client-key.pem',
                                             PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem',
                                             PDO::MYSQL_ATTR_SSL_CA   => '/etc/mysql/ca-cert.pem')
              );
    echo "Connestion established";
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

連接失敗:SQLSTATE [HY000] [2002]

PDO :: __ construct():SSL操作失敗,代碼為1. OpenSSL錯誤消息:錯誤:1416F086:SSL例程:tls_process_server_certificate:證書驗證失敗

但是,當我從連接中刪除SSL塊時,它的工作正常。 我不知道發生了什么事。 可能是服務器和客戶端的版本不匹配。 Becasue我使用舊的公鑰和私鑰。

是因為mysql客戶端和服務器版本不匹配?

PS:我只在網絡服務器上升級了php7。

因此,在搜索和閱讀之后,我認為問題是由於SSL處理已經從PHP 5.6批准,並且默認情況下對等驗證現已啟用。

雖然以下不是關於mysql但關於fsock,我認為這篇文章回答了你的問題: https ://stackoverflow.com/a/32366242/2459026

您可以禁用對等驗證(這通常不是一個好主意)或修復您的根證書。 我認為最好通過禁用同行驗證進行測試,以確保這確實是您的問題。

(請注意,我添加了第二個答案,以及我之前的答案。這不是您問題的答案,但可能與其他人相關)

您說您“將SSL密鑰從一台服務器復制到另一台服務器”。 那么有一台新服務器? 新服務器具有新標識,因此遠程服務器將拒絕證書,因為ID不匹配。

我認為你應該首先從“known_hosts”文件中刪除遠程服務器上的行。 然后在您的Nginx服務器上,您應該使用這些SSH密鑰手動連接到遠程服務器並進行一次連接,以便將新標識添加到known_hosts。

在那之后,我認為它應該工作。

即使以上操作不起作用,我認為最好通過手動連接到遠程主機來調試此問題。 當它工作時,您可以嘗試設置mysql連接。

您可以生成新的SSL證書,並確保使用正確的“通用名稱”:

CA: hostname 
Server: FQDN, e.g. hostname.example.com 
Client: somename

重要的部分是服務器證書,其中Common Name必須與您要連接的主機相同,例如hostname.example.com。

您需要生成新的SSL證書並在服務器上測試端點以確保其正常工作。 你應該沒有問題。 我建議使用Let的加密 :它是免費的,開放的,並且受到高度支持。 請務必按照此處的說明進行操作。

通過一些試驗和錯誤,我能夠在不禁用對等驗證的情況下解決此問題,部分歸功於MySQL文檔:

重要

無論您使用哪種方法生成證書和密鑰文件,用於服務器和客戶端證書/密鑰的公用名稱值都必須與用於CA證書的公用名稱值不同。 否則,證書和密鑰文件將不適用於使用OpenSSL編譯的服務器。 這種情況下的典型錯誤是:

 ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1) 

MySQL文檔

但是,這只是我的一部分。 默認情況下,PHP啟用了VERIFY_IDENTITY ,這需要與Common Name匹配主機名。

這滿足了一切:

CA:分配唯一名稱。 可以是任何東西。 我只是在root. 到我的FQDN。

客戶端和服務器:分配MySQL服務器的FQDN。 這兩個值必須匹配。

如果客戶端和服務器之間的FQDN不匹配,則VERIFY_IDENTITY將失敗。

如果FQDN在ca,客戶端和服務器之間確實匹配,則PHP中的OpenSSL將失敗,如MySQL文檔中所承諾的那樣。

暫無
暫無

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

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