FuelPHPでMysqlにSSL接続する
標準でSSL接続できないのだ。え……? と思ったがしょうがない。試行錯誤の結果を垂れ流す。
困ったことに
標準でSSL接続できないのだ。え……? と思ったがしょうがない。
試行錯誤の結果を垂れ流す。
なお、今回はすでにSSL接続の設定されたDBへのSSL接続だったのだが、DBのセットアップもする場合は証明書の発行やDBへの設定も必要です。
問題
- FuelPHPはMysql接続にPBOを使って接続している
- このPBO自体は(バージョンによっては)SSL接続に対応している
- しかし、Fuelのラッパーがこの拡張に対応していない
- したがって、ラッパーを改変する必要がある
最終的にやったこと
いろいろな試行錯誤はあったのだが、歴史的経緯を書いても意味なさそうなので。
クラスを拡張する
http://fuelphp.jp/docs/1.8/general/extending_core.html#extend_and_replace
これを参考に。
-
fuel/core/classes/database/pdo/connection.php
ファイルをコピーして、 -
fuel/app/classes/pbo/
フォルダを作ってそこにぶち込み、上記リンクの指示に従って書き換え、 - 実質的なPBOへの接続を行う
_connect()
をtryする直前に以下を追加する。
if ( isset($this->_config['connection']['usessl']) && isset($this->_config['connection']['sslattributes']) )
{
$this->_config['attrs'] += $this->_config['connection']['sslattributes'];
}
やってることは単純なのでソースを読んでくれたもれ。
拡張に合わせて config を書き換える
あとは fuel/app/config/[FUEL_ENV]/db.php
ファイルを拡張に合わせて書き換えるだけ。
return array(
'default' => array(
'connection' => array(
'dsn' => 'mysql:host=hoge.com;dbname=hogedb',
'username' => 'testuser',
'password' => 'password',
'usessl' => true,
'sslattributes' => array(
\PDO::MYSQL_ATTR_SSL_CA => '/path/to/hoge.pem',
),
),
),
);
特に参考にしたページ
PBOでの接続
https://dev.classmethod.jp/cloud/aws/rds-mysql-ssl/
PBOの接続する上でのシンプルな記述だったので参考にした。
\PDO::MYSQL_ATTR_SSL_CA
を第四引数にArrayに収めると、SSL接続になる。Fuelを介さない形でPBOでの接続を確認できたので一安心した。
PBOのFuelでの拡張
https://fuelphp.com/forums/discussion/12659/using-ssl-with-pdo-mysql-connections
いろいろと修正は必要だったものの、重要な知見だった……超助かった。
やっぱり英語圏なんだよなぁ。
Azure Database for MySQL への接続
- https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-php-mysql
- https://docs.microsoft.com/ja-jp/azure/mysql/howto-configure-ssl
AzureのDBに使う場合は証明書をダウンロードできる。Laravelは標準でPBOのSSL接続利用ができるようだ、という重要な知見も得られた(^q^)