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 Usage や Extended 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 の値を併せて指定することができます。
このようなユースケースには、以下のようなものがあります (ただし、これらに限りません):
- SSL/TLS 用の証明書
- Extended Key Usage の値が Server Authentication、Client Authentication、またはその両方の証明書を発行します。
- 電子メール保護 (S/MIME) 用の証明書
- Extended Key Usage の値が E-mail Protection の証明書を発行します。
- スマートカード認証 (Microsoft スマートカードログイン) 用の証明書
- Extended Key Usage の値が Smart Card Logon の証明書を発行します。
- 文書署名用の証明書
- Extended Key Usage の値が Document Signing の証明書を発行します。
- コード署名用の証明書
- Extended Key Usage の値が Code Signing の証明書を発行します。
- Matter 接続規格に準拠した証明書
証明書に、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)
- 以下の Extended Key Usage の値を持つ証明書を発行します:
- モバイル運転免許証 (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 (サブジェクトの別名) も指定します。これらの拡張機能と値が電子メール保護証明書に含まれるようにします。
拡張機能:
メール保護用の証明書の発行
- 以下のコマンドを使用して、OpenSSL でキーペアと CSR を作成します。OpenSSL プロンプトで識別名 (Distinguished Name) を入力してください。
- 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 を使用しています。
コマンドが成功すると、発行された証明書の ARN が結果として表示されます:
- このブログの 証明書の取得 セクションに進み、CertificateArn から証明書と証明書チェーン PEM を取得してください。
CSR パススルーの使用
ここでは、スマートカード認証用の証明書を発行する方法を説明します。
証明書署名要求 (CSR) パススルーを通じて、Key Usage 、Extended Key Usage 、subject alternative name (サブジェクトの別名)の拡張機能と値を指定します。
目標は、これらの値をスマートカード認証証明書に含めることです。
拡張機能:
OpenSSL を使用して、これらの特定の拡張フィールドと値をリクエストすることで CSR を生成します。IssueCertificate を呼び出すと、CSR の内容をそのまま反映するテンプレートがリクエストされた拡張情報を認識し、発行する証明書に反映します。
スマートカード認証用の証明書の発行
- 以下のコマンドを使用して秘密鍵を作成します。
- openssl_csr.conf というファイルを作成し、識別名 (Distinguished Name) と要求された CSR 拡張を定義します。
以下は OpenSSL 設定ファイルの例です。この設定を openssl_csr.conf ファイルにコピーし、必要に応じて値を調整できます。設定に関する詳細な参考情報は、OpenSSL ドキュメントで確認できます。
この例では、設定の
[ my_req_ext ]
セクションで Key Usage と Extended Key Usage の値を指定できます。extendedKeyUsage 行では、1.3.6.1.4.1.311.20.2.2 のような Extended Key Usage OID も定義できます。可能な値は OpenSSL ドキュメントで定義されています。 - 設定ファイルを指定して CSR を作成します。
- (オプション) 以下のコマンドを使用して CSR をデコードし、必要な情報が含まれていることを確認できます。
出力には、以下のように要求された拡張とその値が表示されるはずです。
- 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 を使用しています。
コマンドが成功すると、発行された証明書の ARN が結果として以下のように表示されます:
証明書の取得
API パススルーまたは CSR パススルーで issue-certificate を使用した後、PEM 形式で証明書の内容を取得できます。get-certificate コマンドを使用し、証明書を発行したプライベート CA の ARN と、発行された証明書の ARN をそれぞれ指定します。
AWS CLI で --query
コマンドを使用して、証明書と証明書チェーンを別々のファイルで取得できます。
証明書
証明書チェーン
証明書を取得した後、openssl x509 コマンドを使用してデコードできます。これにより、定義した拡張や値を含む証明書の詳細を確認することができます。
まとめ
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 でフォローしてください。