だ。ログ。

開発とかスノボとかやきうとか。

AWSのELBにSSLをインストールして、EC2にEC-CUBE3をインストールして運用するとSSLがおかしくなるはなし

f:id:rider_dice:20170929183753p:plain
図のようにシングルだろうが複数台構成だろうが構わないが、ELB上にSSL証明書をインストールするSSL Terminationと言う技法でELBまではSSL、そこから先は非SSLとして通信すると言うやり方が今のトレンドらしい。

この状況でEC-CUBE3をインストールすると問題が起こる。

インストールStep2のSSL強制が効かない

https://hogehoge.com/install.php/step2

このようなURLでSSLでアクセスする、しかし強制SSLのチェックが出来ない。ブラウザではhttpsで送信しているし鍵マークもついている。
でも、チェックが出来ない。仕方がないから後でconfig.ymlから強制すれば良いや。と放置してインストール自体は完了。

config.ymlからSSL設定をする

/app/config/eccube/config.yml

auth_magic: hogehogefugafuga
password_hash_algos: sha256
shop_name: だ。のしょっぷ。
force_ssl: null
admin_allow_host: {  }
cookie_lifetime: 0
cookie_name: eccube
locale: ja
timezone: Asia/Tokyo
pageinrange: false
trusted_proxies_connection_only: false
trusted_proxies: {  }
eccube_install: 1

この

force_ssl: 1

null -> 1に変更して、ページを表示させる。

SSLがリダイレクトしてしまい、ブラウザからページを表示する事が出来ない。

問題点

1. ELBまでは443のSSLプロトコルで来ているね。と言う事で証明書を確認する。
2. ELBはサーバーに通信をHTTPで行う。

ELB→EC2がHTTP通信になってしまう事が大きな問題。

var_dump($_SERVER);

##この辺を確認
  ["HTTP_X_FORWARDED_PORT"]=>
  string(3) "443"
  ["HTTP_X_FORWARDED_PROTO"]=>
  string(5) "https"
  ["HTTP_CONNECTION"]=>

これで確認すると解るが、通常のサーバーに証明書が突っ込まれたサーバーだと、通信がHTTPSだから
$_SERVER['HTTPS'] = onと言う設定が入っているが、この項目が見つからない。
そりゃそうだ、HTTP通信だからSSLじゃねーよとEC2は判断する。

解決策

EC-CUBEのコントローラとなるindex.phpに以下を記述する
/html/index.php

if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
}

リダイレクトでも良いんだけど、カートの内容保持の問題もあるので問題としてはEC-CUBEのコントローラが$_SERVER['HTTPS']が存在するかを聞いて、SSL強制のチェックのフラグの可否をするので、HTTPSがありますよ。と言う事を$_SERVER変数に持たせる。

この設定を入れて管理画面にhttpsでアクセスすると、チェックボックスを選択する事ができてフロントページSSLの無限リダイレクトを回避する事ができた。
EC-CUBEと言う特性上、ELBまでSSLだから入り口出口は必ずSSLで暗号化されてるし問題無い。と言う判断も出来る事は出来るが見た目上の信頼もある。
それと、出来るのであればHTTPSですと明示させる事も必要だと思う。

今後AWSを使ったECサイト構築、それも複数台構成を考える人が多くなると思う。
多分みんなこの部分で引っ掛かる。HTTP_X_FORWARDED_PROTOでググれば文献は一発で出て来るが、サーバー屋、Web屋どちら共に長けている人も少ない。
と言う事でメモっておく。

この辺、もう少しEC-CUBE使ってる技術者の人間がノウハウとして共有すれば幸せなんだろうが、メシの種なのだろう。