FuelPHPでMysqlにSSL接続する

困ったことに

標準でSSL接続できないのだ。え……? と思ったがしょうがない。

試行錯誤の結果を垂れ流す。

なお、今回はすでにSSL接続の設定されたDBへのSSL接続だったのだが、DBのセットアップもする場合は証明書の発行やDBへの設定も必要です。

問題

  1. FuelPHPはMysql接続にPBOを使って接続している
  2. このPBO自体は(バージョンによっては)SSL接続に対応している
  3. しかし、Fuelのラッパーがこの拡張に対応していない
  4. したがって、ラッパーを改変する必要がある

最終的にやったこと

いろいろな試行錯誤はあったのだが、歴史的経緯を書いても意味なさそうなので。

クラスを拡張する

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での接続

PHPからRDSのMySQLに対してSSL接続する

PBOの接続する上でのシンプルな記述だったので参考にした。
\PDO::MYSQL_ATTR_SSL_CA を第四引数にArrayに収めると、SSL接続になる。Fuelを介さない形でPBOでの接続を確認できたので一安心した。

PBOのFuelでの拡張

fuelphp.com/forums/discussion/12659/using-ssl-with-pdo-mysql-connections

いろいろと修正は必要だったものの、重要な知見だった……超助かった。
やっぱり英語圏なんだよなぁ。

Azure Database for MySQL への接続

docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-php-mysql
docs.microsoft.com/ja-jp/azure/mysql/howto-configure-ssl

AzureのDBに使う場合は証明書をダウンロードできる。Laravelは標準でPBOのSSL接続利用ができるようだ、という重要な知見も得られた(^q^)