ECCUBE on AWS ( Cloudfront -> ELB -> EC2 )

AWSのセミナー前に、AWSに問い合わせてみたところ、
SSL通信するには、
ロードバランサー(ELB)1つに対して、1つの契約が必要と言われたので、

CloudFront > ELB > EC2

しかたなく、

どうしても落ちてほしくないドメインだけを、
ELBを載せようと計画し、

セミナー担当者の方に相談してみたところ、
「1つのELBの契約で、動くのじゃないか?」という、以外な回答で、
ただし、

CloudFront > ELB > EC2

※ただし、条件付き(後述)

***

ひとまず、資料(上図)を作り、担当者にメール

したものの、返事がない・・・けど、
リリース間近なので、いろいろと、試してみたら、
なんとか、

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にして、

Cloudfront > Origin Settings > Match Viewer

ELBのInstanceに、HTTPS のポートを追加してみると、

ELB 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

Default Cache Behavior Settings

上層のCFで強制的に、HTTPS通信にしてやれば、
おそらく問題無いでしょうが、

ELBに証明書が1つしか乗せられないのと、ELB下なので、まあ平文でも良いかと。


PS2.

WordPressでも、同じくSSLのエラーが起きます。
$_SERVER[‘HTTPS’] = onを、wp_config.phpで定義したらよいのかな?

ECCUBE on AWS ( Cloudfront -> ELB -> EC2 )
Tagged on: