AWS構築手順SSL証明書の導入

本章では、SSL証明書の導入手順について説明します。 なお、本書では、さくらインターネットのラピッドSSLの導入を例に説明を進めますが、 他のSSL証明書であっても、AWS Certificate Managerへの登録・ELBの設定等については同じ手順となります。

SSL証明書の取得

  1. まず最初に、CSRを生成しておきます。WebAppサーバーへSSH接続して、以下のコマンドを実行していきます(ドメイン名はご自身のサービスにしてください)
    $ sudo su
    $ mkdir /etc/nginx/ssl # nginxのディレクトリ内にssl管理用のディレクトリを作成します
    $ cd /etc/nginx/ssl
    $ openssl genrsa -out demo.ec-trip.site.2017.key 2048  # ドメイン名+発行年を名前にしています
    $ openssl req -new -key demo.ec-trip.site.2017.key -out demo.ec-trip.site.2017.pem
    
    Country Name (2 letter code) [AU]:JP # 日本
    State or Province Name (full name) [Some-State]:Saitama # 都道府県
    Locality Name (eg, city) []:Toda-shi # 市区町村
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:ec-trip # 会社名またはサービス名
    Organizational Unit Name (eg, section) []: # 部署名(そのままエンターでもOK)
    Common Name (e.g. server FQDN or YOUR name) []:demo.ec-trip.site # SSLの対象とするドメイン名
    Email Address []:yamataka22@gmail.com # 責任者のメールアドレス
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: # 空欄のままエンター
    An optional company name []: # 空欄のままエンター
    
  2. 生成されたpemファイルを表示して、その内容をコピーしておきます。
    $ cat demo.ec-trip.site.2017.pem
    -----BEGIN CERTIFICATE REQUEST-----
    ****
    ****
    -----END CERTIFICATE REQUEST-----
    
  3. 続けて、SSL証明書を申し込みます。本書ではさくらインターネットのラピッドSSLのトップページから申し込みます。申込みの詳細な手順は割愛します。 申込みの中で、CSRの貼り付けが求められますので、先に作成したCSRのコピー結果を貼り付けます。 SSLキャプチャ1
  4. 申込みが完了後、しばらくすると申請完了のメールが届きます。メールに記載されている案内の通り、認証ファイルをWebAppサーバーのpublicディレクトリに作成します。 注:Basic認証を無効化する必要があります。
    $ cd /var/www/ec-trip/current/public
    $ mkdir -p .well-known/pki-validation
    $ cd .well-known/pki-validation
    $ vi fileauth.txt
    # 認証ファイルの内容をペーストして保存
    
  5. ブラウザから「http://SSLを申請したFQDN/.well-known/pki-validation/fileauth.txt」にアクセスして、認証ファイルの内容が表示されることを確認します。 SSLキャプチャ2
  6. しばらくして認証局からのクロールが完了し次第、証明書発行完了の通知メールが届きます。メールの内容に従って証明書をダウンロードします。
    WebAppサーバーに作成したクロール認証ファイルは不要となるので、削除しておきます。
    $ cd /var/www/ec-trip/current/public
    $ rm -rf .well-known
    

AWS Certificate Managers

作成したSSL証明書をAWS Certificate Managersを利用してELBへ登録します。

  1. まずは取得したSSL証明書をAWSに登録します。Certificate Managersページを開き、リージョンが東京であることを確認した後、証明書のインポートをクリックします。 SSLキャプチャ3
  2. 証明書本部には、取得した証明書(crt)の内容をペーストします。
    証明書のプライベートキーには、CSR作成時に生成したkeyファイル(本手順ではdemo.ec-trip.site.2017.key)の中身をペーストします。
    証明書チェーンは、中間証明書になります。中間証明書はSSL証明書のプロバイダによって異なります。証明書発行時のメールに記載された手順にしたがって取得してください。 (今回のラピッドSSLの場合はこちらにリンクがあります。) SSLキャプチャ4
  3. レビュー後、インポートを完了します。以下のようにインポートされたことが確認できます。 SSLキャプチャ5

ELBへの登録

インポートしたSSL証明書をELBに登録します。

  1. 現状のELBは、リスナーにHTTP(Port80)のみを許可しているため、これに加えてHTTPS(Port443)もリスナーに追加します。
    EC2ダッシュボードからロードバランサーを開き、作成済みのロードバランサのリスナータブを表示し、リスナーの追加をクリックします。 SSLキャプチャ6
  2. 以下の通り設定します。証明書タイプは、先程Certificate Managersに登録した証明書を利用するので「ACMから証明書を選択する」になります。
    プロトコル HTTPS(セキュアHTTP)
    ポート 443
    デフォルトターゲットグループ 前回作成したターゲットグループを選択
    証明書タイプ ACMから証明書を選択する
    証明書の名前 インポートした証明書を選択
    セキュリティポリシー デフォルト設定のまま
    SSLキャプチャ7
  3. リスナーが追加されたら、ブラウザからHTTPSでアクセスして確認します。 SSLキャプチャ8

HTTPからHTTPSへのリダイレクト設定

最後に、Nginxに対して、HTTPリクエストでアクセスされた場合にHTTPSにリダイレクトするよう設定を行います。以前に作成したnginxのconfファイル(ec-trip.conf)を編集します。

$ sudo vi /etc/nginx/conf.d/ec-trip.conf

# 13行目あたり〜23行目あたり、コメントアウトされている部分を有効化する
set $https_c 0;
if ($http_x_forwarded_proto != "https") {
    set $https_c 1;
}
# ELBヘルスチェックはHTTPのまま
if ($http_user_agent = "ELB-HealthChecker/2.0") {
    set $https_c 0;
}
if ($https_c = 1) {
    return 301 https://$host$request_uri;
}
SSL証明書はELBに設置しているので、WebAppサーバーに到達するリクエストは、全てHTTPに変換されています。(SSL Termination)
そのため、Nginxへのリクエストは全てHTTPになりますが、ELBはリクエストタイプを$http_x_forwarded_proto に設定しているので、この値がhttpsでない場合はhttpsとしてリダイレクトするように設定しています。
設定後、Nginxを再起動して、httpでサイトにリクエストすると、httpsにリダイレクトされることを確認します。
# Nginx再起動
$ sudo nginx -s reload

以上でSSL証明書の導入・設定の完了となります。
次章では、SESを使った送信メールサーバーの環境構築を行います。