ACMでSSLサーバー証明書を発行し、ALBを利用したWebサーバーでHTTPS通信を実現する手順

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

前回、『ALB+EC2のAWS環境にRoute53を利用して独自ドメインを適用させる手順』でALBを利用したWebサーバーのDNS設定手順について紹介しました。

ALB+EC2のAWS環境にRoute53を利用して独自ドメインを適用させる手順

今回はAWSのACM(Amazon Certificate Manager)を利用してALBのSSL化をおこない、HTTPS通信を実現する手順について紹介します。

今回のゴール
  • ACMの利用方法について理解する
  • ALBを利用したWebサーバーでHTTPS通信を実現する

今回利用するAWS検証環境のイメージ図

パブリックサブネットにALB、プライベートサブネットにEC2(Webサーバー)を配置した構成となっています。
EC2のマシンイメージ(AMI)は『Amazon Linux2』を利用しています。

なお、EC2へのnginxのインストールと、独自ドメインによるHTTPアクセスの設定が完了している前提で話を進めます。

今回利用するAWS検証環境の構築手順については『ALB+EC2のAWS環境にRoute53を利用して独自ドメインを適用させる手順』を参考にしてください。

ACMでSSLサーバー証明書を発行する

ACMとはAWS Certificate Managerの略で、SSLサーバー証明書を発行できるサービスです。
ACMはELBやCloudFrontをはじめとしたACM統合サービスにおいて利用可能です。

AWSマネージメントコンソールで『Certificate Manager』を選択します。

『証明書のプロビジョニング』の『今すぐ始める』を選択します。

『パブリック証明書のリクエスト』にチェックをし、『証明書のリクエスト』を選択します。

『ドメイン名』にSSL化対象の独自ドメインを入力し、『次へ』を選択します。

ACMでSSLサーバー証明書を発行するためにはまず独自ドメインの所有認証を行う必要があります。 ACMでは『DNSの検証』と『Eメールの検証』の2つの認証方法が用意されています。

今回は『DNSの検証』を利用して認証を行いたいと思います。
『DNSの検証』にチェックを入れ『次へ』を選択します。

必要であれば、タグの設定をします。

記載内容に問題なければ『確定とリクエスト』を選択します。

この段階では検証が済んでいないため『検証保留中』というステータスになっていることがわかります。

ドメインの検証を行う

ACMを利用したSSLサーバー証明書の発行を完了させるにはドメインの検証が必要です。
今回は『DNSの検証』を利用した認証手順について紹介します。

先ほどのACMの証明書リクエスト画面にある『DNS設定をファイルにエクスポート』を選択します。

ダウンロードしたファイルにはCNAMEタイプのレコードが記載されています。

CNAMEとは、acme.example.comなどの現在のレコードの名前に対する DNS クエリを、別のドメイン (example.comexample.netなど) またはサブドメイン (acme.example.comzenith.example.orgなど) にマッピングするレコードです。1

ダウンロードしたファイルに記載されているCNAMEをRoute53に登録することでDNS検証は完了します。

『Route53ダッシュボード』を開き、『ホストゾーン』にある紐付け対象のドメインをクリックします。

『レコードセットの作成』を選択します。

『タイプ』に『CNAME – 正規名』を指定します。
csvでエクスポートした情報を記載し、『作成』を押します。

作成後、CNAMEレコードが表示されていればOKです。

CNAMEレコードの登録が完了したら、ACMの画面を確認します。
対象のドメインの状況が『発行済み』になればOKです。

ステータスが『発行済み』になるのにはCNAME登録から数分がかかります。

なお、今回はDNS検証を利用してドメインの所有認証を行いましたが、メール認証にした場合はRoute53にCNAMEを登録する作業は不要となります。

ACMで発行した証明書をALBに適用させる

発行したSSLサーバー証明書をALBに適用させます。

『EC2ダッシュボード』でロードバランサー一覧を開き、SSL化を行う対象のALBをチェックします。
チェック後、『リスナー』タブにある『リスナーの追加』を選択します。

『プロトコル』を『HTTPS』に、『デフォルトのSSL証明書』で先ほどACMで作成した証明書を選択します。
『デフォルトアクション』はターゲットグループへの転送とします。

設定後、『保存』を選択します。

リスナーの一覧にHTTPSが追加されていればOKです。

セキュリティグループの編集

ALBのセキュリティグループでHTTPSのインバウンドアクセスが許可されているか確認します。

ALBの詳細画面でセキュリティグループを選択します。

インバウンドルールにHTTPSが設定されていればOKです。
もし設定されていない場合はルールを編集してHTTPSを追加しておきましょう。

動作確認

httpsでアクセスできるようになっていればOKです。鍵マークをクリックすると証明書の発行元がAmazonになっていることがわかります。

補足: HTTPのアクセスをHTTPSへリダイレクトさせる

ここまででHTTPSでアクセスできるようになりましたが、HTTPでアクセスがきた場合はHTTPで通信が行われます。 そこで、HTTPでアクセスがきた場合はHTTPSへリダイレクトさせるように設定を追加します。

ロードバランサーのリスナー一覧にあるHTTPの『ルールの表示/編集』を選択します。

現在のデフォルトアクションはターゲットグループへの転送となっています。

下記のように、『パスが*(全て)の場合にHTTPSでリダイレクトさせる』というルールを追加します。

以上で設定は完了です。これでhttpでアクセスするとhttpsにリダイレクトされるようになっています。

curlで確認する場合は以下のようになります。

### HTTPレスポンスヘッダーの取得
$curl -I http://deliciouslif.com/
→ httpsへ301リダイレクトされていればOK

HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Wed, 03 Jun 2020 12:58:03 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive
Location: https://deliciouslif.com:443/

まとめ

以上でACMを利用して、ALBをSSL化する方法の紹介を終わります。

ACMの証明書でHTTPS通信を行う手順
  1. ACMでSSLサーバー証明書の登録を行う
  2. DNS検証もしくはメール検証を行い証明書を発行する
  3. ALBのリスナーにACMの証明書を利用したHTTPSを登録する。
  4. ALBの所属するセキュリティグループでHTTPSのインバウンド通信を許可する

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!