Amazon Web Services ブログ

AWS Private CA を使用した特定用途向け証明書の発行方法

本ブログは 2024 年 5 月 30 日に公開されたBlog ”How to issue use-case bound certificates with AWS Private CA” を翻訳したものです。

このブログでは、AWS Private Certificate Authority (AWS Private CA) を使用して、特定の用途やユースケースに合わせた幅広い X.509 証明書を発行する方法を紹介します。これらの特定用途向け証明書は、Key UsageExtended Key Usage 拡張などの証明書コンポーネント内で、その想定される用途が定義されています。IssueCertificate API オペレーションを使用して、必要な Key Usage (鍵用途) および Extended Key Usage (拡張鍵用途) の値を指定して、用途を定義する方法を説明します。

背景

AWS Private CA サービスを使用すると、AWS クラウド内に独自の公開鍵インフラストラクチャ (PKI) を構築し、組織内で使用する証明書を発行できます。AWS Private CA が発行する証明書は、Key Usage 拡張と Extended Key Usage 拡張の両方をサポートしています。これらの拡張機能を特定の値で使用することで、作成時に特定のユースケースに証明書の使用を制限できます。SSL/TLS サーバー認証やコード署名など、証明書を意図されたユースケースに制限することで、アカウンタビリティや最小権限といった具体的なセキュリティ上の利点が得られます。

特定の Key Usage と Extended Key Usage の値で証明書の使用法を定義すると、組織が特定の証明書の目的とそのユースケースを理解するのに役立ちます。監査時に、組織は証明書の Key Usage と Extended Key Usage の値を調べて、証明書の目的と範囲を判断できます。これにより、証明書の使用に関するアカウンタビリティだけでなく、監査人や関係者に対する透明性も確保されます。さらに、これらの拡張機能を特定の値で使用することで、最小特権の原則に従うことができます。使用事例に必要な Key Usage と Extended Key Usage の値のみを定義することで、最小特権を付与できます。例えば、ある証明書が電子メール保護 (S/MIME) にのみ使用される場合、その証明書にはその Extended Key Usage の値のみを割り当てるべきです。

証明書テンプレートとユースケース

AWS Private CA では、Key Usage 拡張機能と Extended Key Usage 拡張機能、およびそれらの値は、IssueCertificate API オペレーションで渡される設定テンプレートを使用して指定されます。AWS が提供するベーステンプレートは、SSL/TLS サーバー認証やコード署名など、最も一般的な証明書のユースケースに対応しています。しかし、ベーステンプレートで定義されていない証明書のその他のユースケースも存在します。これらのユースケースに対応する証明書を発行するには、IssueCertificate リクエストでブランク証明書テンプレートを渡し、必要な Key Usage および Extended Key Usage の値を併せて指定することができます。

このようなユースケースには、以下のようなものがあります (ただし、これらに限りません):

証明書に、AWS ドキュメントで定義されていないあまり一般的ではない Extended Key Usage の値が必要な場合、オブジェクト識別子 (OID) を渡して Extended Key Usage の値を定義することもできます。OID はドット区切りの文字列識別子で、オブジェクトや属性にマッピングされます。OID は、API での直接渡しを使用してカスタム拡張機能で定義および渡すことができます。また、CSR (証明書署名要求) の透過的な受け渡しテンプレートを使用して、CSR で OID を定義することもできます。具体的なユースケースとしては以下が挙げられます:

  • IPSec または仮想プライベートネットワーク (VPN) 関連の拡張機能を必要とする証明書
    • 以下の Extended Key Usage の値を持つ証明書を発行します:
      • OID: 1.3.6.1.5.5.7.3.5 (IPSEC_END_SYSTEM)
      • OID: 1.3.6.1.5.5.7.3.6 (IPSEC_TUNNEL)
      • OID: 1.3.6.1.5.5.7.3.7 (IPSEC_USER)
  • モバイル運転免許証 (mDL) の ISO/IEC 標準に準拠した証明書
    • カスタム拡張機能を使用して、mDL DS 用に予約された ISO/IEC 18013-5 OID :1.0.18013.5.1.2 を含めます。

ブランク証明書テンプレートがエンドエンティティー証明書だけに限定されないことに注意することが重要です。例えば、BlankSubordinateCACertificate_PathLen0_APICSRPassthrough テンプレートは、Basic constraints パラメータを CA:TRUE に設定し、独自の Key Usage および Extended Key Usage 値を持つ下位認証局証明書を発行できるようにします。

ブランク証明書テンプレートの使用

AWS Private CA の証明書テンプレートを閲覧すると、ベーステンプレートでは独自の Key Usage や Extended Key Usage の拡張機能と値を定義できないことがわかるかもしれません。これらは、最も一般的な証明書タイプの発行を簡素化するために、そのタイプの証明書で使用される拡張機能と値に事前設定されています。例えば、EndEntityCertificate/V1 を使用する場合、常に Key Usage の値として Critical, digital signature, key encipherment、Extended Key Usage の値として TLS web server authentication, TLS web client authentication が得られます。以下の表は、このベーステンプレートのすべての値を示しています。

EndEntityCertificate/V1
X509v3 パラメータ
Subject alternative name (サブジェクトの別名) [証明書署名要求 (CSR) からのパススルー ]
Subject (サブジェクト) [CSR からのパススルー ]
Basic constraints (基本制約) CA:FALSE
Authority key identifier (認証局鍵識別子) [CA 証明書のサブジェクト鍵識別子 ]
Subject key identifier (サブジェクト鍵識別子) [CSR から導出 ]
Key Usage (鍵用途) Critical, digital signature, key encipherment
Extended Key Usage (拡張鍵用途) TLS web server authentication, TLS web client authentication
CRL distribution points (CRL 配布ポイント) [CA 設定からのパススルー ]

ブランク証明書テンプレートを見ると、より高い柔軟性があることがわかります。ブランク証明書テンプレートの一例として、BlankEndEntityCertificate_APICSRPassthrough/V1 を見ると、EndEntityCertificate/V1 と比較して、事前定義された値が少ないことがわかります。 Extended Key Usage と Key Usage にカスタム値を設定することができます。

BlankEndEntityCertificate_APICSRPassthrough/V1
X509v3 パラメータ
Subject alternative name (サブジェクトの別名) [API または CSR からのパススルー ]
Subject (サブジェクト) [API または CSR からのパススルー ]
Basic constraints (基本制約) CA:FALSE
Authority key identifier (認証局キー識別子) [CA 証明書のサブジェクトキー識別子 ]
Subject key identifier (サブジェクトキー識別子) [CSR から導出 ]
CRL distribution points (CRL 配布ポイント)

注意:CRL 配布ポイントは、CA が CRL 生成が有効に設定されている場合にのみテンプレートに含まれます。

[CA 設定または CSR からのパススルー ]

希望する拡張と値を指定するには、IssueCertificate API 呼び出しで指定する必要があります。これには 2 つの方法があります:API パススルーテンプレートと CSR パススルーテンプレートです。

  • API パススルー (通過)IssueCertificate パラメータの APIPassthrough で定義された拡張とその値が、発行された証明書にそのままコピーされます。
  • CSR パススルー (通過) – CSR で定義された拡張とその値が、発行された証明書にそのままコピーされます。

これらの値を渡す異なる方法に対応するため、3 種類のブランク証明書テンプレートがあります。CSR ファイルで指定された拡張機能のみを発行する証明書に引き継ぎたい場合は、BlankEndEntityCertificate_CSRPassthrough/V1 テンプレートを使用できます。同様に、APIPassthrough パラメータで指定された拡張機能のみを引き継ぎたい場合は、BlankEndEntityCertificate_APIPassthrough/V1 テンプレートを使用できます。最後に、CSR と APIPassthrough の両方で指定された拡張機能の組み合わせを使用したい場合は、BlankEndEntityCertificate_APICSRPassthrough/V1 テンプレートを使用できます。テンプレートを選択する際は、以下の点に注意することが重要です:

  • テンプレートの定義は、使用するテンプレートの種類に関係なく、常に CSR で指定された値よりも高い優先順位になります。例えば、テンプレートに digital signature という Key Usage が含まれており、CSR ファイルに key encipherment が含まれている場合、証明書はテンプレート定義の digital signature になります。
  • API パススルー値は、API パススルーまたは APICSR パススルーテンプレートを使用する場合にのみ適用されます。CSR からの情報は、CSR パススルーまたは APICSR パススルーテンプレートを使用する場合にのみ適用されます。これらの情報源が競合する場合 (CSR と API パススルーで同じ拡張機能や値が指定されている場合)、通常、次のルールが適用されます:各拡張機能の値について、テンプレート定義が最も高い優先順位を持ち、次に API パススルー値、そして CSR パススルー拡張機能の順になります。テンプレートの処理順序について詳しくは、AWS のドキュメントをご覧ください。

AWS CLI で特定用途向けの証明書を発行する方法

証明書の発行を行うには、適切な AWS Identity and Access Management (IAM) 権限 と、「アクティブ」ステータスの AWS Private CA が必要です。プライベート CA がアクティブであることを確認するには、AWS Command Line Interface (CLI) から aws acm-pca list-certificate-authorities コマンドを実行します。以下のような出力が表示されます:

"Status": "ACTIVE"

ステータスを確認した後、プライベート CA の Amazon リソースネーム (ARN) をメモしておきます。

特定のユースケースに限定された証明書を発行するには、AWS Private CA の IssueCertificate API オペレーション を使用する必要があります。

AWS CLI では、issue-certificate コマンドを使用してこの API を呼び出すことができます。このコマンドには、以下のようないくつかのパラメータを指定する必要があります:

  • (--certificate-authority-arn) – プライベート CA の ARN。
  • (--csr) – PEM 形式の CSR。blob として渡す必要があります (例:fileb://)。
  • (--validity) – 証明書の「有効期限」(失効日時)
  • (--signing-algorithm) – 証明書の署名に使用する署名アルゴリズム。選択する値は、プライベート CA のアルゴリズムファミリー (RSA または ECDSA) と一致する必要があります。例えば、プライベート CA が RSA_2048 を使用している場合、署名アルゴリズムは SHA256WITHRSA のような RSA方式のアルゴリズムである必要があります。

    プライベート CA のアルゴリズムファミリーは、そのキーアルゴリズムを参照することで確認できます。aws acm-pca describe-certificate-authority コマンドで、対応する KeyAlgorithm の値が表示されます。

  • (--template-arn) – ここでブランク証明書テンプレートが定義されます。テンプレートは AWS Private CA テンプレート ARN である必要があります。AWS Private CA テンプレート ARN の完全なリストは、AWS ドキュメントに記載されています。

ここでは、ブランクのエンドエンティティ証明書テンプレートを使用して、特定のユースケースに対応したエンドエンティティ証明書を発行する方法を実演します。2 種類の異なる証明書を発行します。1 つは電子メール保護用、もう 1 つはスマートカード認証用です。電子メール保護とスマートカード認証の証明書には、ベーステンプレートでは定義されていない特定の Extended Key Usage の値があります。スマートカード認証証明書の発行には CSR パススルーを使用し、電子メール保護証明書の発行には API パススルーを使用します。

使用する証明書テンプレートは次のとおりです:

  • CSR パススルーの場合:BlankEndEntityCertificate_CSRPassthrough/V1
  • API パススルーの場合:BlankEndEntityCertificate_APIPassthrough/V1

このデモに関する重要な注意点:

  • これらのコマンドはデモ目的のみです。特定のユースケースによっては、メール保護証明書やスマートカード認証証明書は、このデモで示されているものとは異なる拡張が必要になる場合があります。
  • RSA 2048 秘密鍵を生成します。秘密鍵は適切かつ安全に保護し、保管する必要があります。秘密鍵の暗号化やハードウェアセキュリティモジュール (HSM) での保管などが、保護方法として挙げられます。
  • ここでは OpenSSL コマンドラインツールを使用します。このツールは Amazon Linux 2023 など多くのオペレーティングシステムにデフォルトでインストールされています。このツールがインストールされていない場合は、必要に応じて組織やオペレーティングシステムのソフトウェア配布システムを使用して入手できます。

API パススルーの使用

ここでは、電子メール保護に特化した証明書を発行する方法を実際に示します。Key Usage と Extended Key Usage の値を指定し、API パススルーを通じて subject alternative name (サブジェクトの別名) も指定します。これらの拡張機能と値が電子メール保護証明書に含まれるようにします。

拡張機能:

	 X509v3 Key Usage: critical 
	 Digital Signature, Key Encipherment 
	 X509v3 Extended Key Usage:
	 E-mail Protection 
	 X509v3 Subject Alternative Name:
	 email:john_doe@example.com

メール保護用の証明書の発行

  1. 以下のコマンドを使用して、OpenSSL でキーペアと CSR を作成します。OpenSSL プロンプトで識別名 (Distinguished Name) を入力してください。
    openssl req \
      -out csr-demo-1.csr \
      -new -newkey rsa:2048 \
      -nodes -keyout private-key-demo-1.pem
    
  2. EMAIL_PROTECTION Extended Key Usage の値、デジタル署名と鍵暗号化の Key Usage の値、および subject alternative name (サブジェクトの別名) john_doe@example.com を指定してエンドユーザー証明書を発行するには、以下のコマンドを使用します。値がメールアドレスであるため、Rfc822Name subject alternative name タイプを使用します。

    arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 のデータを、お使いのプライベート AWS Private CA の ARN に置き換え、署名アルゴリズムをAWS Private CA で使用しているアルゴリズムに合わせて変更してください。ここでは AWS Private CA が RSA タイプであると仮定し、SHA256WITHRSA を使用しています。

    aws acm-pca issue-certificate \
      --certificate-authority-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 \
      --csr fileb://csr-demo-1.csr \
      --template-arn arn:aws:acm-pca:::template/BlankEndEntityCertificate_APIPassthrough/V1 \
      --signing-algorithm "SHA256WITHRSA" \
      --validity Value=365,Type="DAYS" \
      --api-passthrough "Extensions={ExtendedKeyUsage=[{ExtendedKeyUsageType="EMAIL_PROTECTION"}],KeyUsage={"DigitalSignature"=true,"KeyEncipherment"=true},SubjectAlternativeNames=[{Rfc822Name="john_doe@example.com"}]}"
    

    コマンドが成功すると、発行された証明書の ARN が結果として表示されます:

    {
        "CertificateArn": "arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111/certificate/123465789123456789"
    }
  3. このブログの 証明書の取得 セクションに進み、CertificateArn から証明書と証明書チェーン PEM を取得してください。

CSR パススルーの使用

ここでは、スマートカード認証用の証明書を発行する方法を説明します。
証明書署名要求 (CSR) パススルーを通じて、Key Usage 、Extended Key Usage 、subject alternative name (サブジェクトの別名)の拡張機能と値を指定します。
目標は、これらの値をスマートカード認証証明書に含めることです。

拡張機能:

	 X509v3 Key Usage: critical 
	 Digital Signature 
	 X509v3 Extended Key Usage:
	 TLS Web Client Authentication, Microsoft Smartcard Login 
	 X509v3 Subject Alternative Name:
	 othername: UPN::john_doe@example.com

OpenSSL を使用して、これらの特定の拡張フィールドと値をリクエストすることで CSR を生成します。IssueCertificate を呼び出すと、CSR の内容をそのまま反映するテンプレートがリクエストされた拡張情報を認識し、発行する証明書に反映します。

スマートカード認証用の証明書の発行

  1. 以下のコマンドを使用して秘密鍵を作成します。
    openssl genpkey \
      -algorithm RSA \
      -pkeyopt rsa_keygen_bits:2048 \
      -out private-key-demo-2.pem
    
  2. openssl_csr.conf というファイルを作成し、識別名 (Distinguished Name) と要求された CSR 拡張を定義します。

    以下は OpenSSL 設定ファイルの例です。この設定を openssl_csr.conf ファイルにコピーし、必要に応じて値を調整できます。設定に関する詳細な参考情報は、OpenSSL ドキュメントで確認できます。

    [ req ] 
    default_bits = 2048 
    prompt = no 
    default_md = sha256 
    req_extensions = my_req_ext 
    distinguished_name = dn 
    
    #Specify the Distinguished Name 
    [ dn ] 
    countryName                     = US 
    stateOrProvinceName             = VA 
    localityName                    = Test City 
    organizationName                = Test Organization Inc 
    organizationalUnitName          = Test Organization Unit 
    commonName                      = john_doe 
    
    
    #Specify the Extensions 
    [ my_req_ext ] 
    keyUsage = critical, digitalSignature 
    extendedKeyUsage = clientAuth, msSmartcardLogin 
    
    #UPN OtherName OID: "1.3.6.1.4.1.311.20.2.3". Value is ASN1-encoded UTF8 string 
    subjectAltName = otherName:msUPN;UTF8:john_doe@example.com 

    この例では、設定の [ my_req_ext ] セクションで Key Usage と Extended Key Usage の値を指定できます。extendedKeyUsage 行では、1.3.6.1.4.1.311.20.2.2 のような Extended Key Usage OID も定義できます。可能な値は OpenSSL ドキュメントで定義されています。

  3. 設定ファイルを指定して CSR を作成します。
    openssl req -new \
      -key private-key-demo-2.pem \
      -out csr-demo-2.csr \
      -config openssl_csr.conf
    
  4. (オプション) 以下のコマンドを使用して CSR をデコードし、必要な情報が含まれていることを確認できます。
    openssl req -in csr-demo-2.csr -noout -text

    出力には、以下のように要求された拡張とその値が表示されるはずです。

    	 X509v3 Key Usage: critical 
    	 Digital Signature 
    	 X509v3 Extended Key Usage:
    	 TLS Web Client Authentication, Microsoft Smartcard Login 
    	 X509v3 Subject Alternative Name:
    	 othername: UPN:: <your_user_here>
  5. issue-certificate コマンドを使用して証明書を発行します。CSR パススルー テンプレートを使用して、CSR ファイル内の要求された拡張と値が発行された証明書にコピーされるようにします。

    arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 のデータを、お使いのAWS Private CA の ARN に置き換え、署名アルゴリズムと有効期間をユースケースに合わせて調整してください。ここでは AWS Private CA が RSA タイプであると仮定して、SHA256WITHRSA を使用しています。

    aws acm-pca issue-certificate \
      --certificate-authority-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 \
      --csr fileb://csr-demo-2.csr \
      --template-arn arn:aws:acm-pca:::template/BlankEndEntityCertificate_CSRPassthrough/V1 \
      --signing-algorithm "SHA256WITHRSA" \
      --validity Value=365,Type="DAYS"
    

    コマンドが成功すると、発行された証明書の ARN が結果として以下のように表示されます:

    {
        "CertificateArn": "arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111/certificate/123465789123456789"
    }

証明書の取得

API パススルーまたは CSR パススルーで issue-certificate を使用した後、PEM 形式で証明書の内容を取得できます。get-certificate コマンドを使用し、証明書を発行したプライベート CA の ARN と、発行された証明書の ARN をそれぞれ指定します。

aws acm-pca get-certificate \
  --certificate-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111/certificate/123465789123456789 \
  --certificate-authority-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 \
  --output text

AWS CLI で --query コマンドを使用して、証明書と証明書チェーンを別々のファイルで取得できます。

証明書

aws acm-pca get-certificate \
  --certificate-authority-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 \
  --certificate-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111/certificate/123465789123456789 \
  --output text \
  --query Certificate >  certfile.pem

証明書チェーン

aws acm-pca get-certificate \
  --certificate-authority-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111 \
  --certificate-arn arn:aws:acm-pca:<region>:<accountID>:certificate-authority/11111111-1111-1111-1111-111111111111/certificate/123465789123456789 \
  --output text \
  --query CertificateChain > certchain.pem

証明書を取得した後、openssl x509 コマンドを使用してデコードできます。これにより、定義した拡張や値を含む証明書の詳細を確認することができます。

openssl x509 -in certfile.pem -noout -text

まとめ

AWS Private CA では、証明書の使用方法を定義することで、アカウンタビリティと最小権限の原則というセキュリティ上の利点を実装できます。 Key Usage と Extended Key Usage の値が、証明書の使用方法を定義します。多くの証明書のユースケースでは、基本的な証明書テンプレートでは定義できない Key Usage と Extended Key Usage の組み合わせが必要です。例として、文書署名、スマートカード認証、モバイル運転免許証 (mDL) 証明書などがあります。これらの特定のユースケースに対応する証明書を発行するには、IssueCertificate API 呼び出しと共にブランク証明書テンプレートを使用できます。ブランク証明書テンプレートに加えて、CSR パススルー機能、API パススルー機能、またはその両方を通じて、 Key Usage と Extended Key Usage の特定の組み合わせを定義する必要があります。

このブログに関する質問がある場合は、AWS サポートにお問い合わせください。

AWS セキュリティに関するニュースをもっと知りたいですか?X でフォローしてください。

Chris Morris

Chris Morris

Chris は AWS のクラウドサポートエンジニアです。暗号化やデータ保護を含む、さまざまなセキュリティトピックを専門としています。クラウドにおけるセキュリティ態勢を強化するために、AWS のお客様が AWS セキュリティサービスを効果的に使用できるよう支援することに注力しています。公開鍵基盤と鍵管理は、彼のお気に入りのセキュリティトピックの一部です。

Vishal Jakharia

Vishal Jakharia

Vishal はアメリカのニュージャージー州を拠点とするクラウドサポートエンジニアです。セキュリティサービスに関する専門知識を持ち、複雑な問題のトラブルシューティングにお客様と協力して取り組むことを好みます。AWS クラウド上での安全でスケーラブルなアーキテクチャの移行と構築をお客様に支援しています。

本ブログは Security Solutions Architect の 中島 章博 が翻訳しました。