NEW: プロジェクトの最新情報をTwitterMastodonで入手できます

CertificateSigningRequest リソース

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest

Kubernetesには、組み込みのCertificateSigningRequestリソースがあります。このリソースは、証明書マネージャーのCertificateRequestと同様に、参照された認証局(CA)から署名付きX.509証明書を要求するために使用されます。

このリソースを使用すると、cert-managerのCertificateRequestリソースではなく、このリソースをサポートするアプリケーションを使用しているユーザーで、cert-managerを通じて証明書に署名してもらいたい場合に役立つことがあります。

CertificateSigningRequestsは、署名リクエストの署名元となるエンティティとしてSignerNameまたは署名者を参照します。cert-managerの場合、署名者はIssuerまたはClusterIssuerのいずれかにマップできます。

機能の状態

この機能は現在実験的な状態であり、その動作は今後のリリースで変更される可能性があります。

⛔️ この機能は、cert-managerコントローラーの--feature-gatesフラグに追加することによってのみ有効になります

--feature-gates=ExperimentalCertificateSigningRequestControllers=true

Helmを使用して追加できます

$ helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set featureGates="ExperimentalCertificateSigningRequestControllers=true" \
--set crds.enabled=true

注:cert-managerは、すべての内部Issuerを使用してCertificateSigningRequestsへの署名をサポートしています。

注:cert-managerは、cert-managerのIssuerを参照するCertificateSigningRequestsを自動的に承認しません。CertificateSigningRequestsのリクエストプロセスについては、Kubernetesドキュメントを参照してください。

署名者名

CertificateSigningRequestsには、リクエストに署名するCAを参照するためのspec.signerNameフィールドが含まれています。cert-manager IssuerまたはClusterIssuerは、次の形式で参照されます

<resource type>.cert-manager.io/<signer namespace (if namespaced)>.<signer name>

たとえば、名前空間sandboxの名前空間にある名前my-issuerのネームスペース付きIssuerは、次のように参照されます。

signerName: issuers.cert-manager.io/sandbox.my-issuer

名前my-cluster-issuerのClusterIssuerは、次のように参照されます。

signerName: clusterissuers.cert-manager.io/my-cluster-issuer

名前空間付きIssuerの参照

CertificateRequestとは異なり、CertificateSigningRequestsはクラスタースコープのリソースです。ユーザーが、アクセス権を持っていない名前空間内の名前空間付きIssuerから証明書を要求できないようにするために、cert-managerはSubjectAccessReviewを実行します。このレビューでは、リクエストしているユーザーが、指定された名前空間内のsignersリソースをreferenceする権限を持っていることを確認します。名前はIssuerの名前、またはその名前空間内のすべてのIssuerを参照する場合は"*"のいずれかである必要があります。

たとえば、sandbox名前空間でIssuerを参照する権限を付与するRoleは、次のようになります。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cert-manager-referencer:my-issuer
namespace: sandbox
rules:
- apiGroups: ["cert-manager.io"]
resources: ["signers"]
verbs: ["reference"]
resourceNames:
- "my-issuer" # To give permission to _only_ reference Issuers with the name 'my-issuer'
- "*" # To give permission to reference Issuers with any name in this namespace

アノテーション

CertificateRequestとの機能パリティを維持するために、アノテーションは、CertificateSigningRequestリソースのspecまたはstatusフィールドとして存在しない値を格納するために使用されます。これらのフィールドは、以下に示すように、リクエスターまたは署名者のいずれかによって設定されます。

リクエスターのアノテーション

  • experimental.cert-manager.io/request-durationリクエスターによって設定されます。リクエストされた証明書の期間を指定するGo時間duration文字列を受け入れます。デフォルトは90日です。VenafiやACMEなどの一部の署名者は、通常、期間をリクエストすることを許可していません

  • experimental.cert-manager.io/request-is-caリクエスターによって設定されます"true"に設定されている場合、CA証明書をリクエストします。

  • experimental.cert-manager.io/private-key-secret-nameリクエスターによって設定されます。SelfSigned署名者のみに必要です。キーtls.keyでリクエスターのX.509証明書署名リクエストのPEMエンコードされた秘密鍵を含むSecretを参照するために使用されます。リクエスターのリクエストに署名するために使用されます。

  • venafi.experimental.cert-manager.io/custom-fieldsリクエスターによって設定されます。Venafi署名者のみの場合はオプションです。Venafiリクエストにカスタムフィールドを追加するために使用されます。これは、Venafi TPP v19.3以降でのみ機能します。値は、名前と値のキーを含むオブジェクトを持つJSON配列です。例を次に示します。

    venafi.experimental.cert-manager.io/custom-fields: |-
    [
    {"name": "field-name", "value": "field value"},
    {"name": "field-name-2", "value": "field value 2"}
    ]

署名者のアノテーション

  • venafi.experimental.cert-manager.io/pickup-id署名者によって設定されます。Venafi署名者でのみ使用されます。発行中に収集するためにVenafi APIに送信された証明書署名リクエストのVenafi Pickup IDを記録するために使用されます。

使用法

CertificateSigningRequestsは、cmctlを使用して手動で作成できます。このコマンドは、入力としてCertificateリソースを含むマニフェストファイルを受け取ります。これにより、秘密鍵が生成され、CertificateSigningRequestが作成されます。CertificateSigningRequestsはデフォルトでは承認されないため、手動で承認する必要がある可能性があります。

$ kubectl certificate approve <name>

開発者向けの内部動作図