ELBに登録したSSLサーバ証明書の署名アルゴリズムを確認する

2015.04.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、虎塚です。

皆さん、SSLサーバ証明書のSHA-2移行はお済みでしょうか? 今日は、ELBにインストール済みの証明書について、更新対象かどうかを確認する方法をご紹介します。

動作確認はMac OS X 10.10.2で行いました。AWS CLIとsedが使える環境であれば、同じ方法で確認できると思います。

背景

サーバ証明書の署名アルゴリズムにSHA-1が利用されている場合、SHA-2への移行が推奨されています。

Windows上でのSHA-1証明書を使ったSSL通信によるWebサイトアクセスは、2017年以降にサポートされません。また、それ以前でも、FirefoxやGoogle Chromeなどの一部ブラウザでは、SHA-1証明書を利用しているサイトへアクセスした時に、ブラウザのアドレスバーに警告が表示されます。

サーバ証明書の申請を受け付けている各ベンダーのWebサイトに、たいてい次のような解説ページがあります。ご利用中のサービスを確認してください。

この件への対応方法は、次のとおりです。

  1. まず、SSL通信を利用しているサーバについて、インストール済みの証明書の署名アルゴリズムがSHA-1かどうかを確認します
  2. 次に、もしSHA-1証明書を使用していれば、証明書ベンダーにSHA-2証明書を新規に申請して、取得します
  3. 最後に、手元のサーバのSHA-1証明書をSHA-2証明書に入れ替えます

今回は、上記の最初の確認ステップについて説明します。

AWS上でサーバ証明書をインストールする場合、ELB (Elastic Load Balancing)CloudFront、またはEC2に立てたWebサーバに組み込みます。Webサーバの場合は、利用しているサーバ製品によって、インストールディレクトリなどが異なります。

そこで、ELBにインストール済みの証明書の署名アルゴリズムを確認する方法を、この記事では紹介します。CloudFrontにインストール済みの証明書を確認する方法は、次の記事をご覧ください。

ELBと証明書のおさらい

ELBへ証明書をインストールするには、次の2通りの方法があります。

1つ目の方法として、あらかじめAWS CLIのIAMコマンドでアップロードしたSSLサーバ証明書を、ELBの設定画面で指定します。

証明書をアップロードするASC CLIのコマンドは、次のとおりです。

% aws iam upload-server-certificate \
  --server-certificate-name 証明書の名前 \
  --certificate-body file://path/to/crtfile.crt \
  --private-key file://path/to/keyfile.key

ELBの設定画面は、次のとおりです。先ほどのコマンドで指定した証明書の名前を選択します。

SSL証明書の選択画面

2つ目の方法として、ELBの設定画面から、証明書の情報をコピーアンドペーストして入力します。

SSLサーバ証明書のアップロード画面

上記のどちらの方法でインストールした証明書も、後からAWS CLIで情報を取りだすことができます。

確認手順

1. AWSにアップロード済みの証明書を確認する

AWS CLIを使って、登録済みの証明書情報の一覧を表示します。

% aws --output json iam list-server-certificates \
  | jq -c '.ServerCertificateMetadataList[] | {(.ServerCertificateName): .Arn}'

{"crt-name-1":"arn:aws:iam::012345678901:server-certificate/crt-name-1"}
{"crt-name-2":"arn:aws:iam::012345678901:server-certificate/crt-name-2"}
{"crt-name-3":"arn:aws:iam::012345678901:server-certificate/crt-name-3"}
{"crt-name-4":"arn:aws:iam::012345678901:server-certificate/crt-name-4"}

ここでは、コマンドの実行結果から、jqで証明書の名前とARNを抽出しています。上の出力例では、4個の証明書の名前とARNが表示されました。

2. ELBにインストール済みの証明書を確認する

AWS CLIを使って、確認した証明書がどのELBにインストールされているかを確認します。

% aws --output json elb describe-load-balancers \
  | jq -c '.LoadBalancerDescriptions[] | {(.LoadBalancerName): .ListenerDescriptions[].Listener.SSLCertificateId}'

{"ELB-Name-1":"arn:aws:iam::012345678901:server-certificate/crt-name-1"}
{"ELB-Name-1":null}
{"ELB-Name-2":null}
{"ELB-Name-2":"arn:aws:iam::012345678901:server-certificate/crt-name-3"}
{"ELB-Name-2":"arn:aws:iam::012345678901:server-certificate/crt-name-4"}

ここでは、コマンドの実行結果から、jqでELBの名前とインストール済み証明書のARNを抽出しています。

上の出力例では、ELB-Name-1には、crt-name-1という名前の証明書がインストールされています。nullの行は、証明書と関連づけていないELBのリスナーを示しています。

3. AWS CLIで証明書情報を取得する

ELBにインストール済みの証明書が特定できたので、証明書情報を取得して、ローカルの任意のファイル(work.crt)に結果を出力します。

aws --output json iam get-server-certificate --server-certificate-name 証明書の名前 \
  | jq -r '.ServerCertificate.CertificateBody' > work.crt
  • 1行目は、出力をJSON形式にするオプションと、証明書の名前を指定するオプションです
  • 2行目は、出力されたJSONから、証明書の本文を取得するためのjqコマンドです

出力内容の最初と最後についているダブルクォーテーションを除去し、改行文字(¥n)を実際の改行に変換するため、jqオプションの-rを使用しています。

4. OpenSSLコマンドで証明書の署名アルゴリズムを確認する

ローカルに出力した証明書情報(work.crt)に対して、OpenSSLコマンドで内容を確認します。

SHA-1証明書の場合、次のような出力になります。

% openssl x509 -text -noout -in work.crt | grep Algorithm

        Signature Algorithm: sha1WithRSAEncryption
            Public Key Algorithm: rsaEncryption
    Signature Algorithm: sha1WithRSAEncryption

この場合、SHA-2証明書の申請と、証明書の入れ替えが必要と分かります。

SHA-2証明書の場合、たとえば次のような出力になります。

% openssl x509 -text -noout -in work.crt | grep Algorithm

        Signature Algorithm: sha256WithRSAEncryption
            Public Key Algorithm: rsaEncryption
    Signature Algorithm: sha256WithRSAEncryption

なお、SHA-2には、SHA-384、SHA-512などのバリエーションがあるため、かならずしも上記のとおりの出力結果になるとは限りません。

おわりに

AWSにアップロードした証明書とELBの情報を照合して、ELBにインストール済みの証明書を確認する方法を説明しました。AWS CLIを使えば簡単に確認できるので、便利ですね。

必要な場合はSHA-2証明書に更新して、来たるべき2017年に備えましょう。

それでは、また。

(2015/7/24 追記: 当初gsedを使用する手順をご紹介しましたが、jqの-rオプションを使うことでgsedを使わなくてもよくなると指摘いただきましたので、削除しました。都元さん、ありがとうございます)