証明書の有効期限が切れるなどで、ELBの証明書を更新するときは、次のようにすると良い。

  1. 新しい証明書をアップロードする
  2. アップロードした証明書のARNを取得する
  3. 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] AWS CLIを使ってELBのサーバ証明書を更新する