雑記帳
2015-07-03 (Fri) [長年日記]
■ [AWS] AWS CLIを使ってELBのサーバ証明書を更新する
証明書の有効期限が切れるなどで、ELBの証明書を更新するときは、次のようにすると良い。
- 新しい証明書をアップロードする
- アップロードした証明書のARNを取得する
- ELBに証明書を関連付ける
順を追って詳しくみていく。
新しい証明書をアップロードする
証明書を更新するということなので、使うAPIは update-server-certificate かと思いきや、これは証明書の名前やパスを変更するためのAPIであり、既存の証明書の入れ替えに使えるわけではない。
ということで、既存の証明書とは重複しない名前を使って、 upload-server-certificate でアップロードする。
% aws iam upload-server-certificate \
--server-certificate-name manage.example.com.20150703 \
--certificate-body file://manage.example.com.crt \
--private-key file://manage.example.com.key
{
"ServerCertificateMetadata": {
"ServerCertificateId": "Axxxxxxxxxxxxxxxxxxxx",
"ServerCertificateName": "manage.example.com.20150703",
"Expiration": "2015-07-17T12:30:37Z",
"Path": "/",
"Arn": "arn:aws:iam::012345678901:server-certificate/manage.example.com.20150703",
"UploadDate": "2015-07-03T07:41:50.230Z"
}
}
--server-certificate-nameには、任意の名前を指定する。 --certificate-bodyには、証明書のファイルを渡す。 --private-keyには、暗号化されていない秘密鍵のファイルを渡す。 中間証明書がある場合は、同様に--certificate-chainを指定する。
file://... という指定の仕方について。カレントディレクトリにあるファイルは、file://fileと指定すれば良い。ルートからの絶対パスを渡す場合は、file:///path/to/fileとする。スラッシュの数に注意する。これは、AWS CLI全般で同じ。
アップロードした証明書のARNを取得する
ELBに証明書を関連付けるには、SetLoadBalancerListenerSSLCertificate APIを使う。
パラメータに、SSLCertificateIdというのがあるので、GetServerCertificate APIで取得できる値にある、ServerCertificateIdを渡せばいいの方思いきや、そうではない。SSLCertificateIdには、ARNを渡す。
ということで、GetServerCertificate APIを使って、ARNを取得する。
% aws iam get-server-certificate \
--server-certificate-name manage.example.com.20150703 \
--query "ServerCertificate.ServerCertificateMetadata.Arn"
"arn:aws:iam::012345678901:server-certificate/manage.example.com.20150703"
ELBに証明書を関連付ける
最後に、アップロードした証明書と、既存のELBのリスナーに関連付ける。 リスナーの指定は、LoadBalancerPortに対して、リスナーがリッスンしているポート番号を指定する。通常は、443だろう。
% aws elb set-load-balancer-listener-ssl-certificate \
--load-balancer-name manage \
--load-balancer-port 443 \
--ssl-certificate-id arn:aws:iam::012345678901:server-certificate/manage.example.com.20150703
成功した場合は、特に出力はない。
結果の確認
実際に設定されているかどうか、確認してみる。
% aws elb describe-load-balancers \
--query 'LoadBalancerDescriptions[?LoadBalancerName==`manage`].ListenerDescriptions[].Listener.SSLCertificateId'
[
"arn:aws:iam::012345678901:server-certificate/manage.example.com.20150703"
]
問題なく設定されていた。
■ [AWS] ELBに設定されている証明書を削除するとInvalid-Certificateになる
AWS CLIで、サーバ証明書を削除するには、delete-server-certificate を使う。ELBに設定されている証明書を削除したら、どうなるだろうかと思って試しにやってみた。
予想では、エラーになるのではないか。
% aws iam delete-server-certificate --server-certificate-name manage.example.com.20150703
特にエラーが出なかった。削除されたようだ。
ELBの状態はどうなるんだろうか。
% aws elb describe-load-balancers --query 'LoadBalancerDescriptions[?LoadBalancerName==`manage`].ListenerDescriptions[]'
[
{
"Listener": {
"InstancePort": 80,
"LoadBalancerPort": 80,
"Protocol": "HTTP",
"InstanceProtocol": "HTTP"
},
"PolicyNames": []
},
{
"Listener": {
"InstancePort": 80,
"SSLCertificateId": "Invalid-Certificate",
"LoadBalancerPort": 443,
"Protocol": "HTTPS",
"InstanceProtocol": "HTTP"
},
"PolicyNames": [
"AWSConsole-SSLNegotiationPolicy-manage-1435909598260"
]
}
]
"SSLCertificateId": "Invalid-Certificate" となるようだ。なるほど。
新しい証明書を有効にした後、古い証明書を削除しようとして、間違って新しい証明書を消さないように注意しないと。
