アドベントカレンダー6日目は、ソフトウェア開発部の橋崎がお届けします。
本日の主題は、AWS Certificate Manager (以下ACM) 証明書の中身をサービスに適用する前に確認したい方向けのTipsです。
Amazonの公式ドキュメントによると、Amazonはルート証明局だけで、(少なくとも)5つ持っているそうです。
ACMから証明書を発行して、サービスに使用している証明書を置き換える機会もあるかと思います。
しかし、再発行の際に認証局の情報が変わってしまったら、既存のサービスに影響が出るのではないかと不安になったことはありませんでしょうか?
一方で、下記のQ&Aをみると、ほとんどのケースでは心配がないようにも思えます。
1 2 3 |
Q: ACM パブリック証明書は、ブラウザ、オペレーティングシステム、モバイルデバイスで信頼されていますか? ACM パブリック証明書は、最新のブラウザ、オペレーティングシステム、モバイルデバイスのほとんどで信頼されています。ACM により提供される証明書は、Windows XP SP3 以降、Java 6 以降を含む、99% のブラウザとオペレーティングシステムで利用されています。 |
なので、実際にこのTipsが必要になる機会はそう多くはないかもしれませんが、どなたかの参考になれば幸いです。
再びAmazonの公式ドキュメントによると、下記のAWS CLIコマンドで、ACMで発行した証明書を取得できます。
1 |
aws acm get-certificate --certificate-arn <証明書のARN> |
なお、コマンドの実行前に:
- AWS CLIの設定
- 証明書 の ARNの確認 (ACMの画面から確認できます)
を済ませておく必要があります。
すると、下記のようなJSON形式の実行結果を得ます。
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "CertificateChain": "-----BEGIN CERTIFICATE-----\nMIIESTCCAzGgAwIBAgITBn+UV4WH6Kx33rJTMlu8mYtWDTANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MTAyMjAwMDAwMFoXDTI1MTAxOTAwM (中略) nupRyzQ7qDn1X8nn8N8V7YJ6y68AtkHcNSRAnpTitxBKjtKPISLMVCx7i4hncxHZS\nyLyKQXhw2W2Xs0qLeC1etA+jTGDK4UfLeC0SF7FSi8o5LL21L8IzApar2pR/\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEkjCCA3qgAwIBAgITBn+USionzfP6wq4rAfkI7rnExjANBgkqhki (中略) DiAdjd4lpFw85hdKrCEVN\n0FE6/V1dN2RMfjCyVSRCnTawXZwXgWHxyvkQAiSr6w10kY17RSlQOYiypok1JR4U\nakcjMS9cmvqtmg5iUaQqqcT5NJ0hGA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0a (中略) EQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----", "Certificate": "-----BEGIN CERTIFICATE-----\nMIIFZTCCBE2gAwIBAgIQDwzcwEzPGkeLPqrQSTUrETANBgkqhkiG9w0BAQsFADBG\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg\nQ0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0xOTEyMDQwMDAwMDBaFw0yMTA (中略) iiIytN204Y490IsXHOF3pcncQP7aX\ngq47qkpEUkliz0ANJebSiCWkQeOCBxppclJpbwmJteHUZPmKH1V0aTnCXzW2UwTJ\nwPg1L5FqxZc4sPD3BNt/dGFV0SuY/4ePe8jBSLJmaYUnVlECMhIS2EQ=\n-----END CERTIFICATE-----\n" } |
今の場合は、キー”Certificate”の値に3つの証明書が入っています。
また、先ほどの公式ドキュメントからわかることは、
- キー”Certificate”の値は、ARNで指定した証明書です
- キー”CertificateChain”の値には、下位の中間証明書からルート証明書まで、順々に入っている
ということです。これら個々の証明書をopensslコマンドにパイプで渡してやれば、証明書の中身を見ることができます。
しかし、このままでは使いづらいと思いますので、各証明書を抽出できるワンライナーを書きました:
1 |
aws acm get-certificate --certificate-arn <証明書のARN> | python -c 'import sys; import json; import re; (lambda x: print(re.findall(re.compile("\s*-----BEGIN CERTIFICATE-----(?:.|\s)*?-----END CERTIFICATE-----\s*"), json.load(sys.stdin)["Certificate" if x==0 else "CertificateChain"])[x-1]))(i)' |
使い方:
- 上の赤字に示したiが0の場合は、ARNで指定した証明書が取得できます
- 上の赤字に示したiが1以上の場合は、証明書チェーンのうち、上からi番目の証明書が取得できます
- あとは、取得したい情報にあったopensslコマンドにパイプでつなぎます
実行例:
1 2 3 4 5 6 7 8 9 |
aws acm get-certificate --certificate-arn <ARNの証明書> | python3 -c 'import sys; import json; import re; (lambda x: print(re.findall(re.compile("\s*-----BEGIN CERTIFICATE-----(?:.|\s)*?-----END CERTIFICATE-----\s*"), json.load(sys.stdin)["Certificate" if x==0 else "CertificateChain"])[x-1]))(3)' | openssl x509 -noout -subject #subject= /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2 aws acm get-certificate --certificate-arn <ARNの証明書> | python3 -c 'import sys; import json; import re; (lambda x: print(re.findall(re.compile("\s*-----BEGIN CERTIFICATE-----(?:.|\s)*?-----END CERTIFICATE-----\s*"), json.load(sys.stdin)["Certificate" if x==0 else "CertificateChain"])[x-1]))(3)' | openssl x509 -noout -issuer #issuer= /C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority |
ルート証明書はStarfield Technologiesが発行したものであり、
1 2 3 4 5 6 7 |
aws acm get-certificate --certificate-arn <証明書のARN> | python3 -c 'import sys; import json; import re; (lambda x: print(re.findall(re.compile("\s*-----BEGIN CERTIFICATE-----(?:.|\s)*?-----END CERTIFICATE-----\s*"), json.load(sys.stdin)["Certificate" if x==0 else "CertificateChain"])[x-1]))(2)' | openssl x509 -noout -subject #subject= /C=US/O=Amazon/CN=Amazon Root CA 1 aws acm get-certificate --certificate-arn <証明書のARN> | python3 -c 'import sys; import json; import re; (lambda x: print(re.findall(re.compile("\s*-----BEGIN CERTIFICATE-----(?:.|\s)*?-----END CERTIFICATE-----\s*"), json.load(sys.stdin)["Certificate" if x==0 else "CertificateChain"])[x-1]))(2)' | openssl x509 -noout -issuer #issuer= /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2 |
ルート認証局であるStarfield Services Root Certificate Authority – G2が、Amazon Root CA 1に中間証明書を発行しています。
※動作確認はAmazon Linux 2上のPython 3.7.4で行いました。また、この結果は特定の環境での実行結果の一例であり、すべての環境において同様な結果が得られることを主張するものではありません。