當前位置: 首頁> 最新文章列表> 為什麼使用ssl_set 函數設置SSL 後連接還是顯示為非加密?可能的原因有哪些?

為什麼使用ssl_set 函數設置SSL 後連接還是顯示為非加密?可能的原因有哪些?

M66 2025-06-23

1. ssl_set()調用順序不正確

mysqli::ssl_set()函數必須在調用mysqli::real_connect()之前調用,否則設置將不會生效。錯誤的調用順序是最常見的疏忽之一。

錯誤示例:

$conn = new mysqli(); $conn->real_connect('db.m66.net', 'user', 'pass', 'database'); $conn->ssl_set('/path/client-key.pem', '/path/client-cert.pem', '/path/ca.pem', NULL, NULL);

正確示例:

$conn = new mysqli(); $conn->ssl_set('/path/client-key.pem', '/path/client-cert.pem', '/path/ca.pem', NULL, NULL); $conn->real_connect('db.m66.net', 'user', 'pass', 'database');

2. 未啟用MYSQLI_CLIENT_SSL標誌

使用real_connect()連接時,若未傳入MYSQLI_CLIENT_SSL標誌,連接可能不會啟用SSL,即使調用了ssl_set()

$conn->real_connect('db.m66.net', 'user', 'pass', 'database', null, null, MYSQLI_CLIENT_SSL);

3. 客戶端未啟用OpenSSL 支持

查看PHP 是否啟用了OpenSSL 擴展非常關鍵。可以通過phpinfo()或命令行執行php -m | grep openssl來確認。如果未啟用,PHP 將無法建立SSL 加密連接。

4. MySQL 服務端未啟用SSL 或未配置完整

服務器端也必須開啟SSL,並且提供合法的證書和CA 文件。可以通過以下SQL 語句確認:

SHOW VARIABLES LIKE '%ssl%';

如果結果顯示have_sslDISABLED ,則無論客戶端如何設置,SSL 都無法生效。

5. 使用了不支持SSL 的庫或驅動

一些舊版本的PHP 或libmysqlclient連接庫可能不支持SSL,或需要特定編譯選項支持。建議使用mysqlnd驅動,因為其原生支持SSL 且更現代化。

6. 驗證連接是否啟用了加密

即便一切配置正確,仍需驗證連接是否啟用了加密。可以通過以下語句查看實際加密狀態:

$result = $conn->query("SHOW STATUS LIKE 'Ssl_cipher'"); $row = $result->fetch_assoc(); if (!empty($row['Value'])) { echo "SSL 启用,加密算法为: " . $row['Value']; } else { echo "SSL 未启用"; }

如果返回為空,說明SSL 實際上並未啟用。

7. 域名或IP 地址引起的隱式退回

在某些環境中,如果使用的是localhost ,連接可能退回到Unix socket,從而繞過網絡層SSL。建議顯式使用主機名或IP 地址,例如:

$conn->real_connect('db.m66.net', 'user', 'pass', 'database');