Rock'n'Hack ブログ

それなりハッカーを目指して、もろもろのメモ。bloggerから引っ越しました。

AWS : IAM でのサーバ証明書の登録方法


今回も boto のお話。

テーマは、「AWSで使用するサーバ証明書を登録してみよう」


ん?サーバ証明書??普通にやればいいんじゃないの??

って初めは思ったんですが、ELBを使ってSSL通信をしようとすると普通に必要になりました。


ELBを使用してSSL通信を使用する時のパターンは下記の2つ。

  1. Client ー (HTTPS) ー ELB:443(HTTPS) ー (HTTP) ーEC2:80
    管理コンソールの表記: 443 (HTTPS, Certificate: testcert) forwarding to 80 (HTTP)
  2. Client ー (HTTPS) ー ELB:443(TCP) ー (HTTPS) ー EC2:443
  3. 管理コンソールの表記: 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を作る予定。

ま、兎にも角にも、ソースを確認するのが一番かと思います。




おしまい。