新:在 TwitterMastodon

证书签名请求资源

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

Kubernetes 有一个内置的 证书签名请求 资源。此资源类似于 cert-manager 的 证书请求,它用于从引用的证书颁发机构 (CA) 请求签名的 X.509 证书。

如果您使用的是支持此资源但不支持 cert-manager CertificateRequest 资源的应用程序,并且希望通过 cert-manager 签署证书,那么使用此资源可能会有所帮助。

CertificateSigningRequests 引用一个 SignerName 或签名者作为它希望签署其请求的实体。对于 cert-manager,签名者可以映射到 颁发者或集群颁发者

功能状态

此功能目前处于实验状态,其行为可能会在后续版本中发生变化。

⛔️ 此功能仅通过将其添加到 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 支持使用所有 内部颁发者 签署 CertificateSigningRequests。

注意:cert-manager 不会自动批准引用 cert-manager 颁发者 的 CertificateSigningRequests。请参阅 Kubernetes 文档,了解 CertificateSigningRequests 的请求过程。

签名者名称

CertificateSigningRequests 包含一个 spec.signerName 字段,用于引用 CA 来签署请求。cert-manager 颁发者或集群颁发者以以下形式引用

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

例如,命名空间为 sandbox 且名为 my-issuer 的命名空间颁发者将通过以下方式引用

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

名为 my-cluster-issuer 的集群颁发者将通过以下方式引用

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

引用命名空间颁发者

与 CertificateRequests 不同,CertificateSigningRequests 是集群范围内的资源。为了防止用户在他们无法访问的命名空间中请求来自命名空间颁发者的证书,cert-manager 会执行 主体访问审查。此审查确保请求用户具有在给定命名空间中 引用 签名者 资源的权限。该名称应该是颁发者的名称,或者 "*" 用于引用该命名空间中的所有颁发者。

以下是一个示例角色,用于授予在 sandbox 命名空间中引用颁发者的权限

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

注释

为了保持与 CertificateRequests 的功能一致性,注释用于存储不存在于 CertificateSigningRequest 资源的 specstatus 字段中的值。这些字段由请求者签名者设置,如下所示。

请求者注释

  • experimental.cert-manager.io/request-duration: 由请求者设置。接受一个 Go 时间持续时间 字符串,指定请求的证书持续时间。默认为 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 数组,其中包含包含 name 和 value 键的对象,例如

    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 取货 ID。

用法

可以使用 cmctl 手动创建 CertificateSigningRequests。此命令接受包含 证书 资源的清单文件作为输入。这将生成一个私钥并创建一个 CertificateSigningRequest。CertificateSigningRequests 默认情况下不会被批准,因此您可能需要手动批准它

$ kubectl certificate approve <name>

面向开发人员的内部工作原理图