確実な接続を実現! PHP と SSL でリモート MySQL データベースに接続する方法
PHP、MySQL、SSL を用いたリモートDB接続と FastCGI エラー解説
必要なもの
- PHP 7.4 以降
- MySQL 5.7 以降
- OpenSSL
- リモート MySQL データベースへのアクセス権
接続手順
-
リモート MySQL サーバーで SSL を有効にする
- MySQL の設定ファイル (
my.cnf
) を編集し、ssl-ca
、ssl-cert
、ssl-key
のオプションを設定します。 - 詳細は、MySQL の公式ドキュメントを参照してください。
- MySQL の設定ファイル (
-
PHP で PDO 接続を確立する
$dsn = 'mysql:host=リモートホスト名;dbname=データベース名;charset=utf8mb4'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_SSL_VERIFY_SERVER_CERT => true, ]; $pdo = new PDO($dsn, 'ユーザー名', 'パスワード', $options);
PDO::ATTR_SSL_VERIFY_SERVER_CERT
オプションをtrue
に設定することで、サーバー証明書の検証を有効にします。
FastCGI でサーバー証明書検証時に以下のエラーが発生する可能性があります。
-
SSL: certificate verify failed
- サーバー証明書が信頼できない場合に発生します。
-
SSL: no cipher matches
- PHP とリモート MySQL サーバーで互換性のある暗号化アルゴリズムが設定されていない場合に発生します。
- 以下のいずれかの方法で解決できます。
php.ini
でopenssl.crypto.library
オプションを設定する。PDO::ATTR_SSL_CIPHER_LIST
オプションで暗号化アルゴリズムのリストを指定する。
トラブルシューティング
接続できない場合は、以下の点を確認してください。
- リモート MySQL サーバーのホスト名とポート番号が正しいことを確認してください。
- ユーザー名とパスワードが正しいことを確認してください。
- 証明書のファイルパスが正しいことを確認してください。
- PHP と OpenSSL のバージョンが互換性があることを確認してください。
本記事では、PHP の PDO を用いて SSL 接続でリモート MySQL データベースに接続する方法と、FastCGI でサーバー証明書検証時に発生するエラーについて解説しました。
<?php
// 定義
const HOST = 'リモートホスト名';
const DB_NAME = 'データベース名';
const USERNAME = 'ユーザー名';
const PASSWORD = 'パスワード';
const CA_FILE = '/path/to/ca.pem';
// PDO 接続
try {
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_SSL_VERIFY_SERVER_CERT => true,
PDO::ATTR_SSL_CAFILE => CA_FILE,
];
$pdo = new PDO('mysql:host=' . HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4', USERNAME, PASSWORD, $options);
// データベース操作
} catch (PDOException $e) {
echo '接続エラー: ' . $e->getMessage() . PHP_EOL;
} finally {
// 接続を閉じる
unset($pdo);
}
?>
- 上記コードはサンプルです。環境に合わせて変更してください。
CA_FILE
は、リモート MySQL サーバーの証明書を発行した CA の証明書ファイルへのパスです。- データベース操作の部分は、必要に応じて書き換えてください。
PDO 以外でのリモート MySQL データベース接続方法
mysqli
- PHP の標準モジュール
- PDO よりも軽量
- 以下のコード例は、SSL 接続とサーバー証明書検証
<?php
// 定義
const HOST = 'リモートホスト名';
const DB_NAME = 'データベース名';
const USERNAME = 'ユーザー名';
const PASSWORD = 'パスワード';
const CA_FILE = '/path/to/ca.pem';
// 接続
$mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB_NAME);
// オプション設定
$mysqli->ssl_set(mysqli::SSL_VERIFY_SERVER_CERT, true);
$mysqli->ssl_set(mysqli::SSL_CAFILE, CA_FILE);
// クエリ実行
$result = $mysqli->query('SELECT * FROM テーブル名');
// データ処理
// 接続を閉じる
$mysqli->close();
?>
その他のライブラリ
- Doctrine DBAL: オブジェクト指向のデータベースアクセスライブラリ
- Propel: ORM フレームワーク
php mysql ssl