AWS Elastic Beanstalkでの自己署名証明書とACMを使用したHTTPS化
AWS Elastic Beanstalkを使ったサーバー構築で,開発環境のHTTPS化の方法を記す。
概要
AWSでWebアプリケーションを構築する場合,AWS Elastic BeanstalkというEC2,S3,RDSなどを自動的に組み合わせてくれるサービスを使うのが最近は一般的なようだ。
AWS Elastic BeanstalkでWebアプリケーションを展開する際,特に何も設定しないとHTTPでの設定となる。HTTPだと通信が暗号化されず,ログイン機能を持たせる場合に脆弱性の問題となる。
そこで,AWS Elastic BeanstalkでのHTTPS化の手順を整理する。独自ドメインを使う場合は登録に手間がかかるるため,まずは自己署名証明書を用いて開発環境 (例: *.eba-mfmegxbn.ap-northeast-1.elasticbeanstalk.com
) をHTTPS化する。
AWSでのHTTPS化はAWSの管理機能と自分で設定の2種類の方法がある。「Elastic Beanstalk 環境用に HTTPS を設定する – AWS Elastic Beanstalk」に記されている通り,管理機能のAWS Cetrificate Manager (ACM) を使う方法が一番簡単なため,今回はACMを使う方法を記す。
ただし,ACMを使う場合,AWSロードバランサーかAmazon CloudFrontディストリビューションの併用が必須となる。AWSの無料期間中は問題ないが,これらの機能は本来追加課金となるため注意する。
ACMを使ったHTTPS化の手順は以下の公式情報を参考にした。
自己署名証明書の作成
まずサーバーの公開鍵証明書を登録する必要がある。
実務で必要になる独自ドメインの場合は手順が異なる。ドメインの用意など手間がかかるので,今回は「X509 証明書を作成し署名する – AWS Elastic Beanstalk」や「OpenSSLによる自己署名証明書の作成」を参考に自己署名証明書を作成する。
以下のコマンドで自己署名証明書を作成する。
openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 3650 \
-subj "/C=/CN=*.eba-mfmegxbn.ap-northeast-1.elasticbeanstalk.com"
コモンネームだけ必須であり,今回は開発用のため他の項目は空にした。
これにより,自己署名証明書server.crtと証明書の秘密鍵server.keyが生成される。
証明書の中身は以下のコマンドで確認できる。
openssl x509 -in server.crt -text
これで自己署名証明書の用意は完了となる。
なお,「ロードバランサーまたは CloudFront ディストリビューション用にインポートした証明書を見つける」や「証明書をインポートする前提条件 – AWS Certificate Manager」にあるとおり,Load Balancerで使う際にはRSA_1024とRSA_2048しか使えないので注意する。
その他,ドメイン名も指定しないとLoad Balancerから証明書のドロップダウンに表示されないので注意する。
また,自己署名証明書だとアクセス時にWebブラウザーが警告を出すので注意する。具体的には,Firefoxだと [MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
] のエラーコードが表示される。
公開鍵証明書の登録
証明書を作成できたら,「IAM に証明書をアップロードする – AWS Elastic Beanstalk」や「証明書のインポート – AWS Certificate Manager」を参考に,IAM (AWS Indentity and Access Management) に証明書をアップロードする。
アップロードはコマンドからもできる。今回はコンソールを使用して証明書インポートする。
まず,ACMコンソールを開く。
初回の場合,[Provision certificates]>[Get started] を選ぶ。2回目以降は直接管理画面に移動する。
画面上部の [Import a certificate] を選ぶ。
証明書の取り込み画面が表示される。
先ほど作成したserver.crtとserver.keyの中身 (-----BEGIN -----
から-----END -----
まで) をそれぞれ [Certificate body] と [Certificate private key] に貼り付けて [Next] を選ぶ。
[Add Tags] では証明書の種類が分かるように [Name] に [self] と入力してみる。
その後 [Review and import] を選び,最後の確認画面で [Import] を選ぶ。
これで証明書がACMに登録される。最後に,登録した証明書を選んで,[ARN] (例: arn:aws:acm:ap-northeast-1:148763676769:certificate/29b82349-755e-43ea-8a77-034e7f081afd) を控えておく。
後にロードバランサーの設定で使用する。
ロードバランサーの有効化
ACMを使ったお手軽HTTPS対応ではロードバランサーの併用が前提となる。
そのため,ロードバランサーを有効にしていない場合,「環境タイプ – AWS Elastic Beanstalk」を参考にロードバランサーを有効にする。
1. Elastic Beanstalk コンソールを開く。
2. ナビゲーションペインで [Environment] を選び,設定する環境 (今回はTutorialLalavel-env) を選ぶ。
3. [Configuration]>[Capacity]>[Edit] を選ぶ。
4. [Environment type] に [Load balanced] を選び [Apply] を選ぶ。
これでロードバランサーの設定が完了となる。
HTTPSの設定
続いてHTTPSの設定を行う。
[Configuration]>[Load balancer]>[Edit] を選ぶ。
[Listeners]>[Add listener] を選ぶ。
ロードバランサーの設定は,事前に選んだロードバランサーの種類によって若干変わる。
今回はデフォルトの [Classic Load Balancer] の場合を記す。
以下のように項目を選び [Add] を選ぶ。
- Listener port: 443
- Listener protocol: HTTPS
- Instance port: 80
- Instance protocol: HTTP
- SSL certificate: *.elasticbeanstalk.com
右下の [Apply] を選ぶ。
その後,Classic Load Balancerの場合に以下のファイルを用意する。
SSLCertificateIdには,証明書登録時のARNを指定する。
ファイルを用意したらソースバンドルに追加・同梱する。
その後,Elastic Beanstalk コンソールから [Upload and Deply] で用意したファイルをアップロードする。
最後に,https://のスキームでWebアプリケーションにアクセスして,HTTPS化が完了できていることを確認する。
結論
AWS Elastic BeanstalkでのACMと自己署名証明書を用いた開発環境 (*.eba-mfmegxbn.ap-northeast-1.elasticbeanstalk.com
) のHTTPS化の手順を記した。
独自ドメインでの設定方法はネット上にもそれなりに情報があったが,自己署名証明書を用いた開発環境のHTTPS化の情報はあまりなかった。
証明書の作成やHTTPSの設定など,細かい設定ミスがあり,2日と思っていた以上に情報の整理に時間がかかった。
独自ドメインの設定手順も似たような手順で行えるので,近い内にそちらの手順も整理しておきたい。