ELBに登録したSSLサーバ証明書の署名アルゴリズムを確認する
こんにちは、虎塚です。
皆さん、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サイトに、たいてい次のような解説ページがあります。ご利用中のサービスを確認してください。
この件への対応方法は、次のとおりです。
- まず、SSL通信を利用しているサーバについて、インストール済みの証明書の署名アルゴリズムがSHA-1かどうかを確認します
- 次に、もしSHA-1証明書を使用していれば、証明書ベンダーにSHA-2証明書を新規に申請して、取得します
- 最後に、手元のサーバの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の設定画面は、次のとおりです。先ほどのコマンドで指定した証明書の名前を選択します。
2つ目の方法として、ELBの設定画面から、証明書の情報をコピーアンドペーストして入力します。
上記のどちらの方法でインストールした証明書も、後から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を使わなくてもよくなると指摘いただきましたので、削除しました。都元さん、ありがとうございます)