AWSのセミナー前に、AWSに問い合わせてみたところ、
SSL通信するには、
ロードバランサー(ELB)1つに対して、1つの契約が必要と言われたので、
しかたなく、
どうしても落ちてほしくないドメインだけを、
ELBを載せようと計画し、
セミナー担当者の方に相談してみたところ、
「1つのELBの契約で、動くのじゃないか?」という、以外な回答で、
ただし、
※ただし、条件付き(後述)
***
ひとまず、資料(上図)を作り、担当者にメール
したものの、返事がない・・・けど、
リリース間近なので、いろいろと、試してみたら、
なんとか、
Cloudfont -> ELB -> EC2 が、
鍵付きのSSLで通信出来た!!
.
しかし、
ECCUBEをインストールし、テスト環境と同じように表示されるようになったものの、
管理画面にログインしようとするけど、入れない!!
AUTH_MAGICを変更したからだと、戻してみるけど、ダメ。
error.logを覗くと、
2016/08/25 02:55:42 [/admin/index.php] Fatal error(E_USER_ERROR): on [/var/www/html/eccube/_data/class/SC_Response.php(195)] from 10.0.1.104 login_id = ****(0)[****] /var/www/html/eccube/admin/index.php(28): LC_Page_Admin_Index_Ex->process /var/www/html/eccube/_data/class_extends/page_extends/admin/LC_Page_Admin_Index_Ex.php(54): LC_Page_Admin_Index->process /var/www/html/eccube/_data/class/pages/admin/LC_Page_Admin_Index.php(54): LC_Page_Admin_Index_Ex->action /var/www/html/eccube/_data/class_extends/page_extends/admin/LC_Page_Admin_Index_Ex.php(71): SC_Response->sendRedirect /var/www/html/eccube/_data/class/SC_Response.php(195): trigger_error
管理者パスワードがわからなくなった時に、LC_Page_Admin_Index.phpの
$this->arrErr = $this->lfCheckError($objFormParam);
を、
コメントアウトして、無理やりなスリ抜けもやって見たけど、ダメ。
どうも、該当行が違うみたい。
config.phpを疑ってみる
「ECCUBE SSL ログインできない SSL」などでググってみると、
HTTP_URLに、https:// の記述があると、ダメってことで、
http:// 戻してみるが、
リダイレクトが繰り返されダメ!!Orz
ADMIN_FORCE_SSL = trueにしてみるけど、甲斐なし
***
これらを、踏まえ、調べてみると、
$_SERVER[‘HTTPS’]をNULLで返すサーバーがあり、sfIsHTTPSで正常に判定できない為、発生する物と思われます。
http://svn.ec-cube.net/open_trac/ticket/1501
参考 >>?[PHP] https で表示しているページでも $_SERVER[‘HTTPS’] が on にならない
config.phpなどから、
$_SERVER[“HTTPS”] の値を吐き出してみると、
NULL だった。
犯人は、Cloud -> ELB -> EC2間のHTTP
Origin Settingsを、Match Viewerにして、
ELBのInstanceに、HTTPS のポートを追加してみると、
「SSL用の証明を追加しろ」と、怒られた。
ELBは1つしかSSL証明を追加できないので、ここに追加して良いものか?
そもそも、証明書を発行するドメインが不明・・・
$_SERVER[‘HTTPS’]をいじってみる
$_SERVER[‘HTTPS’] = on にしてみると、
普通に動く(一部、例外あり)ので、ECCUBEのソースを探ってみたら、
public static function sfIsHTTPS() { // HTTPS時には$_SERVER['HTTPS']には空でない値が入る // $_SERVER['HTTPS'] != 'off' はIIS用 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { return true; } else { return false; } }
となっているので、
コレをジャックするしかない!?
ELBに証明書を入れても、ELB -> EC2間は平文になってしまうようで、
これを、回避するために、ELBは、特殊なヘッダーを付けてくれるようです。
$_SERVER[“HTTP_X_FORWARDED_PROTO”]
参考 >>?http://blog.purazumakoi.info/?p=949
***
実際のところ、$_SERVER[‘HTTPS’]を使っている箇所は、
- GC_Utils.php
- SC_Utils.php
以外にも、module/pluginなどで、割りと使われているので、
HTTP_X_FORWARDED_PROTOで判別後、
$_SERVER[‘HTTPS’] = on
にするのが、吉みたいです!
class_exあたりで変更を加えていいのですが、
割りと、初期に呼ばれるdefine.phpに、定義しました。
が、
今回、上にCloudFrontがいるので、届く情報は「http」だけOrz
なので、カッコ悪いけど、URLで判断するしかなさそう。
しかも、Reffererで・・・
if (preg_match('/^https\:/', $_SERVER['HTTP_REFERER'])) { $_SERVER['HTTPS'] = on; }
PS.
config.phpのADMIN_FORCE_SSLですが、Trueにすると、
リダイレクトループになるので、
HTTP_URLを「https://」にしてみました。
管理画面にもマイページにも入れるし、ログイン・ログアウトも問題なさそうです。
** 追記@2016-08-26 **
直接、HTTPのURLを叩かれると、ReffererはNULLとなるため、
httpsアクセスのみに、制限しようと思うが、
上記の通り、CF・LBを経由しているため、WEBサーバー側では判断出来ないため、
Cloudfront上で、HTTP redirect HTTPSに設定。
Default Cache Behavior Settings
上層のCFで強制的に、HTTPS通信にしてやれば、
おそらく問題無いでしょうが、
ELBに証明書が1つしか乗せられないのと、ELB下なので、まあ平文でも良いかと。
PS2.
WordPressでも、同じくSSLのエラーが起きます。
$_SERVER[‘HTTPS’] = onを、wp_config.phpで定義したらよいのかな?