今Amazonクラウドでサービスを運営していて、現在はHTTPだけのところを、セキュリティのためにHTTPSを導入したいと思いました。
ちょっと試行錯誤しながらですがちゃんと導入できたようなので、メモしておきます。
ロードバランサに証明書を入れる
Webサーバが複数あるので、全てのインスタンスに証明書を導入する必要があるかと思いきや、ロードバランサにだけ入れるということができるそうです。
Amazon ELBでSSL設定をしてみる
要するに、HTTPSでのアクセスをロードバランサで受けて、各Webサーバインスタンスに80ポートに貫通させるということ。
しかも、これならWebサーバ自体HTTPのままなのでmod_sslとか入れなくて良いので、いろいろと楽です!
鍵の生成
opensslコマンドで鍵を生成します。
$ openssl genrsa 2048 > private-key.pem
Generating RSA private key, 2048 bit long modulus
..............................................................................+++
.....+++
e is 65537 (0x10001)
$ openssl req -new -key private-key.pem -out csr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
...(略)...
$ cat csr.pem
-----BEGIN CERTIFICATE REQUEST-----
...(略)...
こうしてできたCSRを、認証局に送ってサーバ証明書を発行してもらいます。SSL証明書は、数千円のものから数十万円のものまでありますが、用途に合わせて選びます。
CSRとは、Corporate Social Responsibilityではなくて、Certificate Signing Requestです。
新規のELBにHTTPSを導入
新しくロードバランサを立ち上げる場合は、Amazon Management Consoleからでも、簡単にHTTPSの設定ができます。
しかしながら、既に作成したELBでは、この方法が使えません。そして、おそらくAmazon Management Consoleからは、そのあたりのことは操作することができません。
Command Line ToolでELBにHTTPSを追加
ブラウザ上からはできないのですが、コマンドラインからならできるようです。
ELBでHTTPS(SSL証明書)の設定方法
まずは、証明書をアップロードします。
(IAM Command Line Toolkitのダウンロード→http://aws.amazon.com/developertools/4143)
$ iam-servercertupload -b hostcert.pem -k private-key.pem -s newCert -v --aws-credential-file account-key
arn:aws:iam::************:server-certificate/newCert
XXXXXXXXXXXXXXXXXXXXX
続いて、ELBに設定するのですが、なにやら怒られました。
(Elastic Load Balancing API Toolsのダウンロード→http://aws.amazon.com/developertools/2536)
$ elb-set-lb-listener-ssl-cert myelb-lb --lb-port 443 --cert-id arn:aws:iam::************:server-certificate/newCert --region ap-northeast-1 --aws-credential-file account-key
elb-set-lb-listener-ssl-cert: Malformed input-There is no configured listener for load balancer
'myelb-lb' on port [443]
Usage:
elb-set-lb-listener-ssl-cert
LoadBalancerName --lb-port value --cert-id value [General Options]
For more information and a full list of options, run "elb-set-lb-listener-ssl-cert --help"
どうも最初にHTTPSの443ポートを開けていないといけないようです。そこで、443ポートをあけてやるようにします。
$ elb-create-lb-listeners myelb-lb --listener "protocol=https,lb-port=443,instance-port=80,cert-id=arn:aws:iam::************:server-certificate/newCert" --region ap-northeast-1 --aws-credential-file account-key
OK-Creating LoadBalancer Listener
こちらのコマンドで一発オーケー。Amazon Management Consoleで見ても、443ポートから80ポートにポートフォワーディングされています。
ブラウザで開いてみる
実際に、 https://example.com でアクセスをしてみると、ちゃんとHTTPSで接続ができ、中身はHTTPでアクセスした時と同じものが表示されました。
コメント
[…] 随分前のブログで少し怪しいですが、「既存のAmazon ELBにSSL証明書を導入してHTTPSを使えるようにする。」では、SSL証明書を購入してELBに導入しました。(ちなみに、現在はManagement Consoleか […]