今回も boto のお話。
テーマは、「AWSで使用するサーバ証明書を登録してみよう」
ん?サーバ証明書??普通にやればいいんじゃないの??
って初めは思ったんですが、ELBを使ってSSL通信をしようとすると普通に必要になりました。
ELBを使用してSSL通信を使用する時のパターンは下記の2つ。
- Client ー (HTTPS) ー ELB:443(HTTPS) ー (HTTP) ーEC2:80
管理コンソールの表記: 443 (HTTPS, Certificate: testcert) forwarding to 80 (HTTP) - Client ー (HTTPS) ー ELB:443(TCP) ー (HTTPS) ー EC2:443 管理コンソールの表記: 443 (TCP) forwarding to 443 (HTTPS)
2番は普通のオーソドックスな感じなので特に問題ないんですが、
1番の構成の際には、ELBに証明書を仕込んでおかないとおけないので、
今回のような作業が必要になります。
ちなみに先に行っておくと、下記のような構成は取れません。自分もハマったので書いておきます。
- Client ー (HTTPS) ー ELB:443(HTTPS) ー (HTTPS) ーEC2:443
管理コンソールの表記: 443 (HTTPS Certificate: testcert) forwarding to 443 (HTTPS)
これは、↓に記載して頂いている通りなのですが、
https://forums.aws.amazon.com/thread.jspa?threadID=65908
『443 (HTTPS, Certificate: testcert) forwarding』っていう表記は、
ELBでデコードして、HTTP としてバックエンドに foward するって意味みたいです。
なので、バックエンドの443番ポート宛に、HTTPリクエストを送信しても通信出来ないって話の模様。
ということで、バックエンドのサーバでSSLのデコード処理を行いたい、という時は、
『443 (TCP) forwarding to 443 (HTTPS)』として、TCPレベルでフォワードするようです。
ちょっと横道に逸れたので戻ります。
各サーバでいちいち証明書を置くと更新の時とかめんどくさいな、ってことで通常はロードバランサに証明書を設置すると思います。
で、そのやり方がAWSでは少し面倒なので、その作業時のメモとなります。
※ちなみに管理コンソールの画面から登録する際は、ELBを作成するウィザードに従えば特に問題ないです。
まず、証明書そのものの管理は、AWS Identity and Access Management (IAM) というサービスで行います。
ここで登録した鍵を、ELBに指定するって段取りです。
ということで順々に~
※前提条件として、事前に秘密鍵(Private Key) および サーバ証明書(Certificate)を用意しておく。
◆IAM へ接続
>>> import boto>>>
>>> iam = boto.connect_iam()
>>>
>>> iam
IAMConnection:iam.amazonaws.com
◆秘密鍵を読み込む
>>> file = open('c:\\test_ssl_01.pem')>>>
>>> ssl_key = file.read()
>>>
>>> print ssl_key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAvEu5agbh4zh01ljL3uYRgmmAbVVSizq/nT7zF31X77lnbwvw
bnborX28/rMnPxrM0hz0CX+ZNL6auF/OSzazhEZeF37eGIFZdD7X5zI/ykpqs21m
省略
HO/qFVlA/OCGr1lNZN0MP766acM+wuZYNWLe8PsJsWKRpUvFis8fbiKzGrU4IUIw
1NQNPW2Jh33nTXgST6z/VACKK009CRSKjuHGsL+Q6Qz3DlNsFRd2Dw==
-----END RSA PRIVATE KEY-----
>>>
>>> file.close()
>>>
◆サーバ証明書を読み込む
>>> file = open('c:\\test_ssl_01.crt')>>>
>>> ssl_cert = file.read()
>>>
>>> print ssl_cert
-----BEGIN CERTIFICATE-----
MIIDXDCCAkQCCQCw6W5wOPTjKzANBgkqhkiG9w0BAQUFADBwMQswCQYDVQQGEwJK
UDEOMAwGA1UECBMFVG9reW8xDjAMBgNVBAcTBVRhaXRvMRUwEwYDVQQKEwxLb2dh
省略
mP2CsdGyhM+wjDTaRa+BjDHA4i0Ejirsl2qmXWGQHEYOrKetctWcvFqB8rBbiHFP
W3eNr4lty5t981L84/uyrKMUAbbBVhB0nwBkmfg+hADV4glDEQG4SV1nD9QKeXDh
-----END CERTIFICATE-----
>>>
>>> file.close()
>>>
◆読み込んだ秘密鍵およびサーバ証明書をIAMに登録する
>>>>>> iam.upload_server_cert(cert_name='test', cert_body=ssl_cert, private_key=ssl_key, cert_chain=None, path='/test/')
# 'test'という名前で、秘密鍵にssl_cert、証明書にssl_key、中間証明書はなし、パスに'/test/'、としてサーバ証明書を登録します。 ※パスの指定はしなくてもいい。
{u'upload_server_certificate_response': {u'upload_server_certificate_result': {u'server_certificate_metadata': {u'path': u'/test/', u'server_certificate_name': u'test', u'server_certificate_id': u
'ASCAIJ3HWRLVWFDVANOGS', u'arn': u'arn:aws:iam::123456789012:server-certificate/test/test', u'up
load_date': u'2011-07-26T06:52:20.193Z'}}, u'response_metadata': {u'request_id': u'ceda5b91-b753-11e
0-9b5a-59ca0a36ed54'}}}
>>>
>>>
これで証明書の登録はOK。
あとはちょろっといじってみたエビデンス。
◆登録した証明書をリネームしてみる
>>>>>> iam.update_server_cert('test', 'testtest')
{u'update_server_certificate_response': {u'response_metadata': {u'request_id': u'c7ddea61-b754-11e0-
a65b-9768a3ece439'}}}
>>>
>>>
◆登録済みの全ての証明書を確認する
>>> iam.get_all_server_certs(){u'list_server_certificates_response': {u'list_server_certificates_result': {u'server_certificate_me
tadata_list': [{u'path': u'/test/', u'server_certificate_name': u'testtest', u'server_cer
tificate_id': u'ASCAIJ3HWRLVWFDVANOGS', u'arn': u'arn:aws:iam::123456789012:server-certificate/t
est/testtest', u'upload_date': u'2011-07-26T06:52:20Z'}], u'is_truncated': u'false'}, u'response_met
adata': {u'request_id': u'd946b403-b754-11e0-a65b-9768a3ece439'}}}
>>>
◆登録済みの任意のパスの証明書を確認する
>>>>>> iam.get_all_server_certs('/test/')
{u'list_server_certificates_response': {u'list_server_certificates_result': {u'server_certificate_me
tadata_list': [{u'path': u'/test/', u'server_certificate_name': u'testtest', u'server_certificat
e_id': u'ASCAIJ3HWRLVWFDVANOGS', u'arn': u'arn:aws:iam::123456789012:server-certificate/test/tes
ttest', u'upload_date': u'2011-07-26T06:52:20Z'}], u'is_truncated': u'false'}, u'response_metadata':
{u'request_id': u'93cd18f1-b755-11e0-bfd1-eb401a61dfc0'}}}
>>>
◆登録済みの任意の名前の証明書を確認する
>>>>>> iam.get_server_certificate('testtest')
{u'get_server_certificate_response': {u'response_metadata': {u'request_id': u'4add43ea-b756-11e0-9b5
a-59ca0a36ed54'}, u'get_server_certificate_result': {u'server_certificate': {u'server_certificate_me
tadata': {u'path': u'/test/', u'server_certificate_name': u'testtest', u'server_certificate_id':
u'ASCAIJ3HWRLVWFDVANOGS', u'arn': u'arn:aws:iam::123456789012:server-certificate/test/testtest'
, u'upload_date': u'2011-07-26T06:52:20Z'}, u'certificate_body': u'-----BEGIN CERTIFICATE-----\nMIID
XDCCAkQCCQCw6W5wOPTjKzANBgkqhkiG9w0BAQUFADBwMQswCQYDVQQGEwJK\nUDEOMAwGA1UECBMFVG9reW8xDjAMBgNVBAcTBV
RhaXRvMRUwEwYDVQQKEwxLb2dh\nc29mdHdhcmUxDzANBgNVBAsTBlN5c3RlbTEZMBcGA1UEAxMQaWN0LXJpa2F0c3Uu\naW5mbz
省略
zgujqj4DZNFyIvSzBq5OQJp0noDmwRyl/GZ4HNQ+93DEPt3Kcq\nmP2CsdGyhM+wjDTaRa+BjDHA4i0Ejirsl2qmXWGQHEYOrKet
ctWcvFqB8rBbiHFP\nW3eNr4lty5t981L84/uyrKMUAbbBVhB0nwBkmfg+hADV4glDEQG4SV1nD9QKeXDh\n-----END CERTIFI
CATE-----'}}}}
>>>
>>>
◆不要な証明書を削除する
>>>>>> iam.delete_server_cert('testtest')
{u'delete_server_certificate_response': {u'response_metadata': {u'request_id': u'3aef79c2-b759-11e0-
a65b-9768a3ece439'}}}
>>>
こんな感じですかね。
これで証明書が登録できたということで、次回はHTTPSを使用するELBを作る予定。
ま、兎にも角にも、ソースを確認するのが一番かと思います。
おしまい。
0 件のコメント:
コメントを投稿