雑記帳
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" となるようだ。なるほど。
新しい証明書を有効にした後、古い証明書を削除しようとして、間違って新しい証明書を消さないように注意しないと。