困ったことに

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

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

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

問題

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

最終的にやったこと

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

クラスを拡張する

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

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