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');
使用real_connect()連接時,若未傳入MYSQLI_CLIENT_SSL標誌,連接可能不會啟用SSL,即使調用了ssl_set() 。
$conn->real_connect('db.m66.net', 'user', 'pass', 'database', null, null, MYSQLI_CLIENT_SSL);
查看PHP 是否啟用了OpenSSL 擴展非常關鍵。可以通過phpinfo()或命令行執行php -m | grep openssl來確認。如果未啟用,PHP 將無法建立SSL 加密連接。
服務器端也必須開啟SSL,並且提供合法的證書和CA 文件。可以通過以下SQL 語句確認:
SHOW VARIABLES LIKE '%ssl%';
如果結果顯示have_ssl為DISABLED ,則無論客戶端如何設置,SSL 都無法生效。
一些舊版本的PHP 或libmysqlclient連接庫可能不支持SSL,或需要特定編譯選項支持。建議使用mysqlnd驅動,因為其原生支持SSL 且更現代化。
即便一切配置正確,仍需驗證連接是否啟用了加密。可以通過以下語句查看實際加密狀態:
$result = $conn->query("SHOW STATUS LIKE 'Ssl_cipher'");
$row = $result->fetch_assoc();
if (!empty($row['Value'])) {
echo "SSL 启用,加密算法为: " . $row['Value'];
} else {
echo "SSL 未启用";
}
如果返回為空,說明SSL 實際上並未啟用。
在某些環境中,如果使用的是localhost ,連接可能退回到Unix socket,從而繞過網絡層SSL。建議顯式使用主機名或IP 地址,例如:
$conn->real_connect('db.m66.net', 'user', 'pass', 'database');