mysqli :: ssl_set()関数は、 mysqli :: real_connect()を呼び出す前に呼び出す必要があります。そうしないと、設定は有効になりません。間違った順序は、最も一般的な監視の1つです。
エラー例:
$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_set()が呼び出されても、接続はSSLを有効にしない場合があります。
$conn->real_connect('db.m66.net', 'user', 'pass', 'database', null, null, MYSQLI_CLIENT_SSL);
PHPがOpenSSL拡張機能を有効にしているかどうかを確認することが重要です。 php -m |を実行することで確認できますgrepは、 phpinfo()またはコマンドラインを介してopensslをopensslします。有効になっていない場合、PHPはSSL暗号化された接続を確立できません。
また、サーバーはSSLを有効にし、法的証明書とCAファイルを提供する必要があります。次のSQLステートメントで確認できます。
SHOW VARIABLES LIKE '%ssl%';
結果がHAS_SSLが無効になっていることを示している場合、SSLはクライアントの設定に関係なく有効になりません。
PHPまたはlibmysqlclient接続ライブラリのいくつかの古いバージョンは、SSLをサポートしていないか、サポートするために特定のコンピレーションオプションが必要になる場合があります。 SSLをネイティブにサポートし、より近代的であるため、 MySQLNDドライバーを使用することをお勧めします。
すべてが正しく構成されていても、接続が有効になっていることを確認する必要があります。次のステートメントで実際の暗号化ステータスを表示できます。
$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ソケットに戻り、ネットワークレイヤーSSLをバイパスすることがあります。たとえば、明示的なホスト名またはIPアドレスを使用することをお勧めします。
$conn->real_connect('db.m66.net', 'user', 'pass', 'database');