ELBでSSL Termination後の内部通信を暗号化する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SSL Terminationとは

ELBにSSL Terminationといって、ロードバランサー側でSSL認証を行ってくれる機能があります。WEBクライアントからSSL(443ポート)でリクエストが来ると、ELBがSSL証明書の確認をします。正しく処理されれば、ELB配下のEC2インスタンスに対して80ポートで通信を行います。

つい最近、このSSL Termination後のELBとEC2間の通信を改めて暗号化通信する方法ができましたのでご紹介します。

デモ用SSL証明書の作成

まずはデモ用にSSL証明書を作成します。詳しい説明は割愛しますが、証明書を作成する際に鍵の暗号化を外しています。本物を申請するときにはSSL会社の指示に従ってください。

$ openssl req -new -x509 -nodes -out server.crt -keyout server.key
Generating a 1024 bit RSA private key
..................++++++++++++++
........++++++++.........++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shinjyuku-Ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Classmethod
Organizational Unit Name (eg, section) []:Director 
Common Name (eg, YOUR name) []:Satoshi
Email Address []:satoshi@example.com

どういった形式のものか確認をします。このテキストは後で貼付けます。

$ cat server.crt 
-----BEGIN CERTIFICATE-----
MIIDojCCAwugAwIBAgIJALpicGZAg2xsMA0GCSqGSIb3DQEBBQUAMIGTMQswCQYD
VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xFTATBgNVBAcTDFNoaW5qeXVrdS1LdTEU
MBIGA1UEChMLQ2xhc3NtZXRob2QxETAPBgNVBAsTCERpcmVjdG9yMRAwDgYDVQQD
EwdTYXRvc2hpMSIwIAYJKoZIhvcNAQkBFhNzYXRvc2hpQGV4YW1wbGUuY29tMB4X
DTExMTAyNjE3MjYxNVoXDTExMTEyNTE3MjYxNVowgZMxCzAJBgNVBAYTAkpQMQ4w
DAYDVQQIEwVUb2t5bzEVMlkzmshlfaihxlasiuehmxfaesfasxfMnOC501qDKv9R
mcaemiuahecmfiuhscmfihszdfciuhsdlfczsmhflIUHjxKCvkBbRMg221qXBWzr
Fcqgz2CFFKPCbGSD8eAagVZCjMoBQQzF4wcaqfjQYK3IhD4Z7EAhmRxELESZM30n
clNdyfty29wN60ZjTupZJtJBRPzXIH4tqX8UcBuME0Wuqb8dduHoosboMdoIz4NX
AgMBAAGjgfswgfgwHQYDVR0OBBYEFIakyhKRDi2UpjmPQoE1vBLw6sXLMIHIBgNV
HSMEgcAwgb2AFIakyhKRDi2UpjmPQoE1vBLw6sXLoYGZpIGWMIGTMQswCQYDVQQG
EwJKUDEOMAwGA1UECBMFVG9reW8xFTATBgNVBAcTDFNoaW5qeXVrdS1LdTEUMBIG
A1UEChMLQ2xhc3NtZXRob2QxETAPBgNVBAsTCERpcmVjdG9yMRAwDgYDVQQDEwdT
YXRvc2hpMSIwIAYJKoZIhvcNAQkBFhNzYXRvc2hpQGV4YW1wbGUuY29tggkAumJw
ZkCDbGwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBjYK7t7/e6IUgo
/pNVEXRVb3R8pA5S0vy+cBGn49Rs4N1Y0EhZk2tUg0dzKGNBfeCYip2H0DcNCKIf
3KC7O9Z/pu7Koa9Ej1a+9G/9J8hlHcpQuKr6vhkB0KkkxaU4/LiSaBoXivWuydAn
BCDQK2TkCgSDzAhtJIp8t9GDStuP+Q==
-----END CERTIFICATE-----

こちらは同時に生成されたプライベートキーです。

$ cat server.key 
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDrhWzuIts+DJzgudNagyr/UY8Sgr5AW0TINttalwVs6xXKoM9g
hRSjwmxkg/HgGoFWQozKAUEMxeMHGqn40GCtyIQ+GexAIZkcRCxEmTN9J3JTXcn7
ctvcDetGY07qWSbSQUT81yB+Lal/FHAbjBNFrqm/HXbh6KLG6DHaCM+DVwIDAQAB
AoGAdOg3CQHuWIUNHUMHLKDUGLMIUWHMXIUHET3shkwemlEa8Qjfx2Znt13j1gUU
xAwEFWBVaFQ1CPUVW0pmAqbUxZrTNdykuz5gkgR7Q3RAjsAEuTQnqDLuKxScPc1S
CdB4zn4NpO2m+keNc0L3sg3aTeGR+QHV8qBgldcktqqv46kCQQD3GNy/gYIXalEI
QpqhFM56iCPGxcTauLTfzXY8jBp4ZtWsQeUKVz8tcOIUyQ7xzaCRjB+mW54hnf/V
8Y3Rl8/DAkEA9AHKeVjTFvDJotmyiPLRdCgl30REfK+XL/KPPXMkF6hpAAj6vGEO
ONf+eUxeqRxnSOL1sSTQiP2BK12xBQ+43QJBAINc01Z4Kkn6enPSvNPv9MlNgP+W
ek3xLi9g0n/j19q0iNnXMCWHHR!LWAKMHFLWUHWHMIFHLIUHFkUp8sQ/WfMCQA9O
WXQZNUyYGB3mCAP9L1RY/F8v+hfUL+irD38sTNRLFSMSbSAJ+oloSycyujFjfbsd
uYm+JHKjbEnbG7KUlOUCQQDZ5D6pBmWwrR6QxlRt+L4g2qcHZfpPCJY5Gbo5jxeK
RcXyK+JhFYThcRtKkfhs32/MolDx2Dthj9YtSwfWWb63
-----END RSA PRIVATE KEY-----

Management ConsoleからELBを生成する

ELBの作成プロセスにおいて、SSLを設定するとSSL Terminationの設定を行う事ができます。また、SSLからSSLといった転送を選択した場合には、ELBとEC2間の通信暗号化について設定を行うことができます。

443ポートを設定したのでSSL Terminationの設定について聞かれます。opensslで作成した鍵のテキストを貼付けましょう。

次に、暗号アルゴリズムとハッシュアルゴリズムの組み合わせについて選択します。

そして、ELBとEC2間の暗号化について聞かれますので、必要に応じて証明書を記述します。

最後に、ロードバランサーの設定をします。

ELB配下に置くEC2インスタンスを登録します。

最後の最後の確認が出て、問題なければCreateボタンを押して作成完了です。

まとめ

ELBのSSL Terminationは待望の機能でしたが、さらに応用としてELBとEC2の通信を暗号化することもできるようになりました。普通のプログラマーにとってロードバランサーを実際に触りながら理解を深める機会はなかなか無いかと思います。ELBを活用してロードバランサーマエストロになっちゃいましょう!