«前の日記(2015-06-30 (Tue)) 最新 次の日記(2015-07-05 (Sun))» 編集

雑記帳


2015-07-03 (Fri) [長年日記]

[AWS] AWS CLIを使ってELBのサーバ証明書を更新する

証明書の有効期限が切れるなどで、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] 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" となるようだ。なるほど。

新しい証明書を有効にした後、古い証明書を削除しようとして、間違って新しい証明書を消さないように注意しないと。