EC2 だけhttps化(not with ロードバランサー but Nginx)
完全に備忘録です。
テスト環境を作るために、もう一つEC2を立てました。
本当に一部の機能のテストをするだけのものです。
例えば、ブラウザとLinux間でライブストリーミングを行ったり。
ロードバランサ―も特に必要ないと思うので、EC2を直接HTTPS化します。
おおまかな流れ
ロードバランサ―を使った場合は
Route53で名前解決
⇒ ロードバランサ―のポート443に
⇒ EC2のポート80に
というリクエストの流れでした。
今回は直接
Route53で名前解決
⇒ EC2のポート443に
とします。
443で受けるのが、ロードバランサ―ではなくEC2になったのでSSL証明書もEC2につけます。
SSL証明書は発行してある前提です。
他者サーバからのSSL証明書インポートは前の記事をご覧ください。
他サーバーで取得したドメインをAWSでhttps化する その1(CSRの取得、SSL証明書のインポート)
証明書のEC2へのつけ方ですが、ApacheやNginxのようなWebサーバに組み込みます。
今回はNginxを使いました。
参考にした記事は
AWSでWebサイトをHTTPS化 その2:EC2(+外部SSL証明書)編
と
nginx:SSLサーバ証明書の設定[スタンダード]
です。
Route53、EC2の443ポートの開放とか
まず、Route53で使うドメインのホストゾーンのレコードに新たにAレコードとして、使うドメインとEC2のIPアドレスを登録。
これでそのドメインへのリクエストは全てEC2に流れます。
次はEC2の443ポート開け。
EC2のセキュリティグループのインバウンドで、タイプ:HTTPSを選びます。
ロードバランサ―ではここで証明書が必要でしたが、EC2の場合はこれだけでポート443が開きます。
で、最後にNginxに関する設定。
大きく2つやることがあります。
1つは、SSL証明書と秘密鍵をEC2に置くこと。
2つ目は、Nginxの設定ファイルをSSL用に書き換えること。
Nginxの設定 1.SSL証明書と秘密鍵をEC2に置く
SSL証明書をEC2に置くRoute53で証明書インポートが出来たということは、証明書(.crt)を持っているはずですね。
中間証明書も持っていると思います。
それらを結合します。
cat 証明書.crt 中間証明書.crt > conncted.crt
(正直言うと、結合してない証明書で試してないので、結合が必要かは分かりません)
ここで出来たcrtファイルを/etc/pki/nginxとかに置きます。
ここの場所は、あとでnginx設定ファイルで指定するのでどこでもいいっぽいです。
/etc/pki/nginxはデフォルトでは存在しないので、mkdirしてください。
秘密鍵をEC2に置く
同じく、SSL証明書をインポートしたときに使った.keyファイルを同じディレクトリに置きます。
ここで注意するのが、SSL取得の際に使った.keyではなく、SSL証明書インポートの時に使った、パスフレーズを除いたあとの.keyファイルだということです。
インポートに使ったkeyファイルがない場合は、
openssl rsa -in SSL取得の際に使った.key
で必要な中身が出てくるので、それをテキトウに作った空のkeyファイルにコピペします。
SSL取得の際に使った鍵ファイルの中身は
-----BEGIN PRIVATE KEY-----
(文字列色々)
-----END PRIVATE KEY-----
で、
SSL証明書インポートの時に使う、今回手に入れるべき鍵ファイルの中身は
-----BEGIN RSA PRIVATE KEY-----
(文字列沢山)
-----END RSA PRIVATE KEY-----
です。
この鍵ファイルをserver.keyとします。
これを証明書と同じ/etc/pki/nginxに置きます。
ちなみにこれらのファイルは重要なので、所有者をrootにして権限を400にするといいらしいです。
Nginxの設定 2.設定ファイルをSSL用に書き換え
先ほど、/etc/pki/nginxに証明書と鍵ファイルを置きました。
443でNginxがリクエストを受け取ったときにこの2つのファイルを参照させます。
server{
listen 80;
とかになっているところを
listen 443 ssl;
に変え、
ssl on;
ssl_certificate "/etc/pki/nginx/connected.crt";
ssl_certificate_key "/etc/pki/nginx/server.key";
を追加して、参照させます。
これで完了です。
httpをhttpsにリダイレクトさせたいとき
ロードバランサ―を使ってSSL化したときは、Djangoのリダイレクト設定で、http ⇒ httpsにしていました。
今回はNginxでリダイレクトさせます。
というか、今のままだとNginxは443でしかリクエストを受け付けないので、80のリクエストには対応できません。
listen:80を加えて、return でhttps://の方を返してあげればいいのです
server {
listen 80;
server_name ドメイン;
return 301 https://ドメイン;
}
とすれば、301でhttps://の方にリダイレクトさせられます。
とまぁこんな感じで設定できました。
Nginxのその他の設定とかは必要ですが、そこは割愛して、httpのものをhttpsに、という差分だけ記事にしました。
インフラは何をやってるか分かってきだしてから少し楽しくなってきました。
Nginx使いやすい!