证书签名请求资源
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/v1kind: Rolemetadata:name: cert-manager-referencer:my-issuernamespace: sandboxrules:- 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 资源的 spec
或 status
字段中的值。这些字段由请求者或签名者设置,如下所示。
请求者注释
-
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 TPPv19.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>