AWS + お名前.com でSSL化してみた

# はじめに
以前、AWS + お名前.comで独自ドメインのwordpressブログを開設したのですが、サイトのSSL化を行っていませんでした。セキュリティ上よろしくないので、今回、SSL化を行った時のことを簡単にメモしました。

# SSLとは
**SSL**とは、インターネット上の通信を暗号化の仕組みです。トランスポート層のプロトコルであり、HTTPやFTPなどのプロトコルで行われる通信を暗号化して安全に送受信するためのプロトコルです。

サイトにSSLを導入すると、訪問者のブラウザとサーバー間のデータ通信が暗号化されます。また、サイトのURLがhttpから**https**に変わります。このsはsecureを意味します。

## SSLの目的
* 意図した接続先かどうか（なりすましでないか）の証明（認証）
* 通信内容の暗号化

## SSLとSSHの違い
SSLと似た名前で**SSH**というものがあります。
SSHはAWSで作成したサーバーにアクセスする時などで耳にすることがあると思いますが、
SSLとSSHはどちらも通信の暗号化に関係していますが、その違いを大雑把にいうと

SSL：インターネット用
SSH：遠隔操作用

の通信を暗号化しています。

## SSLの暗号化の仕組み
SSLではデータの暗号化・復号化をするために、特定のブラウザとサーバーでのみ使用可能な「**共通鍵**」を用いて送受信を行う。そのため、データが不正アクセスで流出したとしても、共通鍵で守られているので、データの悪用を防止できる。

1.　ブラウザがサーバーにSSL通信を要求すると、サーバーがブラウザにサーバ証明書（公開鍵含む）を送信。このとき、サーバーは秘密鍵を所持。
2.　ブラウザはサーバーから受け取った公開鍵で共通鍵を作成し、暗号化した共通鍵をサーバーに送信。
3.　サーバーは暗号化された共通鍵を秘密鍵で複合。これにより、ブラウザとサーバはどちらも共通鍵を持った状態。
4.　共通鍵で暗号化したデータをブラウザとサーバー間でやり取りする。


# SSL化導入の手順
AWSの構成図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/c6c0361c-e2c4-624d-a90e-7479ea2e351b.png" width=75%>

基本的に、以下の参考記事通りに行えばSSL化することができます。
* [[AWS] 徹底図解！お名前.comで取得したDNSをAWS Route53/Cloudfrontで管理するまでの手順](https://deep.tacoskingdom.com/blog/12)
* [AWSxお名前.comで作成したサイトをSSL化[具体例あり]](https://katsuhiroblog.com/aws-wordpress-ssl/)

そのため、ここでは簡単な流れのみを説明します。
(なお、以下の流れは、既にお名前.comで独自ドメインを取得してDNS設定まで完了していることを想定しています。)

1.　Certificate ManagerでSSL証明書を発行 (AWS)

2.　お名前.comに外部の**CNAME**を設定
・[DNSレコード設定用ネームサーバー変更確認]のチェックボックスにチェックを入れないように注意。(Route 53のNSの４つの値を既に登録しているので、チェックを入れると初期化されてしまう。初期化してしまった場合、再設定する必要あり。)

3.　Route 53で**CNAME**のレコードを作成 (AWS)

4.　SSL証明書が発行されたことの確認 (AWS)

5.　ロードバランサーの設定 (AWS)
・Application Load Balancerを利用
・httpリクエストされた時にhttpを返さずに、httpsにリダイレクトされるように設定するのをお忘れなく!

6.　Route 53の作成済みのAレコード（Elastic IP）を選択して、エイリアスを設定（AWS）

7.　「https://ドメイン名」で表示されるか確認

# 関連用語の説明
* **SSL(Secure Sockets Layer)**：インターネット上の通信の暗号化の仕組み。トランスポート層のプロトコルであり、HTTPやFTPなどのプロトコルで行われる通信を暗号化して安全に送受信するためのプロトコル。
* **SSH（Secure Shell）**：暗号化された遠隔ログインシステム。
* **DNS（Domain Name System）**：ドメイン名とIPアドレスを紐づけるシステム。人間がわかりやすいように、IPアドレス（数値の羅列）をドメイン名（文字の羅列）に変換。このシステムを担当するのがDNSサーバーで、「フルサービスリゾルバ」と「ネームサーバー」の2種がある。
* **フルサービスリゾルバ**：ドメイン情報を教えて欲しいという問い合わせをネームサーバーにするサーバー。問い合わせ結果を一定期間保存することで、再度同じ名前で問い合わせがあった時に高速化・ネームサーバ負荷の軽減を図ることができる。この保存時間をTTL(Time To Live)と呼ぶ。
* **ネームサーバー**：ドメインとIPアドレスを紐づける台帳（ゾーンファイル）を持ったサーバー。フルサービスリゾルバからのドメイン情報を教えて欲しいという問い合わせに対して、返答する。
* **DNSレコード**：ドメインとIPアドレスを紐づけるゾーンファイル（台帳）に書かれた一行ごとの情報。A/AAAA/MX/NS/CNAME/TXTレコードといった種類がある。
    * **Aレコード**：ホスト名とIPアドレスの関連付けを定義するレコード。
    * **NSレコード**：ゾーン情報を管理するネームサーバーのサーバー名を定義するレコード。
    * **CNAMEレコード**：正規ホスト名に対する別名を定義するレコード。特定のホスト名を別のドメイン名に転送するときなどに利用。例）ドメイン名：abc.com、ホスト名：www と VALUE：www.onamae.com　とした場合、⇒ "http://www.abc.com/"にアクセスすると"http://www.onamae.com/"に転送される。
* **ロードバランサー**（ELB：Elastic Load Balancing）：他のサービスへのトラフィックを、仮想サーバーなどの複数のターゲットに自動的に分散して、安定稼働をサポートするサービス。複数のサーバーへの負荷を均一化して、障害への耐性を高める。
* **Application Load Balancer**：AWS ELBのうち最新で高機能。基本的にこれを利用。HTTPトラフィックおよびHTTPSトラフィックの負荷分散、柔軟なアプリケーション管理が可能。

# まとめ
無事に自作のブログをSSL化することができてよかったです。AWSの1年間の無料利用枠であれば、ブログを安く運営することができ、勉強にもなるのでみなさんもやってましょー。

# 参考
* [SSLとは？　セキュリティ上の意味や仕組み、メリットをわかりやすく解説！](https://ds-b.jp/media/pages/200/#:~:text=SSL%EF%BC%88Secure%20Sockets%20Layer%EF%BC%89%E3%81%A8,%E3%81%8C%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
* https://wa3.i-3-i.info/diff384security.html
* https://qiita.com/satodayo/items/b45573b7165235a15152
* [DNSレコードとは？基本の仕組みを理解しよう](https://www.weblab.co.jp/staff/other/10116.html)
* https://help.onamae.com/answer/7883]
* [AWSでWebサイトをHTTPS化 全パターンを整理してみました](https://recipe.kc-cloud.jp/archives/11067)
* [AWSでSSL化する方法を伝授！！！](https://qiita.com/nakanishi03/items/3a514026acc7abe25977)
* [[AWS] 徹底図解！お名前.comで取得したDNSをAWS Route53/Cloudfrontで管理するまでの手順](https://deep.tacoskingdom.com/blog/12)
* [Application Load Balancer を使い HTTP リクエストを HTTPS にリダイレクトするにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-redirect-http-to-https-using-alb/)