証明書の有効期限が切れるなどで、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" ]
問題なく設定されていた。