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

CloudFront > ELB > EC2

しかたなく、

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

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

CloudFront > ELB > EC2

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

***

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

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

Cloudfont -> ELB -> EC2 が、
鍵付きのSSLで通信出来た!!

.
しかし、
ECCUBEをインストールし、テスト環境と同じように表示されるようになったものの、
管理画面にログインしようとするけど、入れない!!

 

AUTH_MAGICを変更したからだと、戻してみるけど、ダメ。

error.logを覗くと、

管理者パスワードがわからなくなった時に、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のソースを探ってみたら、

となっているので、

コレをジャックするしかない!?

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で・・・

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通信にしてやれば、
おそらく問題無いでしょうが、

なんか、見つかったら、追記します。


 

 

PS2.

WordPressでも、同じことが起き得ます。
wp_config.phpあたりで定義したらよいのかな?

 

 

 

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