新:在TwitterMastodon

证书请求资源

apiVersion: cert-manager.io/v1
kind: CertificateRequest

CertificateRequest 是 cert-manager 中一个命名空间资源,用于从 Issuer 请求 X.509 证书。该资源包含一个 PEM 编码的证书请求的 base64 编码字符串,该字符串将发送到引用的颁发者。成功发行将返回一个基于证书签名请求的已签署证书。 CertificateRequests 通常由控制器或其他系统使用和管理,不应由人类使用 - 除非特别需要。

一个简单的 CertificateRequest 如下所示

apiVersion: cert-manager.io/v1
kind: CertificateRequest
metadata:
name: my-ca-cr
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQzNqQ0NBY1lDQVFBd2daZ3hDekFKQmdOVkJBWVRBbHBhTVE4d0RRWURWUVFJREFaQmNHOXNiRzh4RFRBTApCZ05WQkFjTUJFMXZiMjR4RVRBUEJnTlZCQW9NQ0VwbGRITjBZV05yTVJVd0V3WURWUVFMREF4alpYSjBMVzFoCmJtRm5aWEl4RVRBUEJnTlZCQU1NQ0dwdmMyaDJZVzVzTVN3d0tnWUpLb1pJaHZjTkFRa0JGaDFxYjNOb2RXRXUKZG1GdWJHVmxkWGRsYmtCcVpYUnpkR0ZqYXk1cGJ6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFLd01tTFhuQkNiRStZdTIvMlFtRGsxalRWQ3BvbHU3TlZmQlVFUWl1bDhFMHI2NFBLcDRZQ0c5Cmx2N2kwOHdFMEdJQUgydnJRQmxVd3p6ZW1SUWZ4YmQvYVNybzRHNUFBYTJsY2NMaFpqUlh2NEVMaER0aVg4N3IKaTQ0MWJ2Y01OM0ZPTlRuczJhRkJYcllLWGxpNG4rc0RzTEVuZmpWdXRiV01Zeis3M3ptaGZzclRJUjRzTXo3cQpmSzM2WFM4UkRjNW5oVVcyYU9BZ3lnbFZSOVVXRkxXNjNXYXVhcHg2QUpBR1RoZnJYdVVHZXlZUUVBSENxZmZmCjhyOEt3YTFYK1NwYm9YK1ppSVE0Nk5jQ043OFZnL2dQVHNLZmphZURoNWcyNlk1dEVidHd3MWdRbWlhK0MyRHIKWHpYNU13RzJGNHN0cG5kUnRQckZrU1VnMW1zd0xuc0NBd0VBQWFBQU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUFXR0JuRnhaZ0gzd0N3TG5IQ0xjb0l5RHJrMUVvYkRjN3BJK1VVWEJIS2JBWk9IWEFhaGJ5RFFLL2RuTHN3CjJkZ0J3bmlJR3kxNElwQlNxaDBJUE03eHk5WjI4VW9oR3piN0FVakRJWHlNdmkvYTJyTVhjWjI1d1NVQmxGc28Kd005dE1QU2JwcEVvRERsa3NsOUIwT1BPdkFyQ0NKNnZGaU1UbS9wMUJIUWJSOExNQW53U0lUYVVNSFByRzJVMgpjTjEvRGNMWjZ2enEyeENjYVoxemh2bzBpY1VIUm9UWmV1ZEp6MkxmR0VHM1VOb2ppbXpBNUZHd0RhS3BySWp3ClVkd1JmZWZ1T29MT1dNVnFNbGRBcTlyT24wNHJaT3Jnak1HSE9tTWxleVdPS1AySllhaDNrVDdKU01zTHhYcFYKV0ExQjRsLzFFQkhWeGlKQi9Zby9JQWVsCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
isCA: false
usages:
- signing
- digital signature
- server auth
# 90 days
duration: 2160h
issuerRef:
name: ca-issuer
# We can reference ClusterIssuers by changing the kind here.
# The default value is Issuer (i.e. a locally namespaced Issuer)
kind: Issuer
group: cert-manager.io

CertificateRequest 将使 cert-manager 尝试请求 Issuer ca-issuer 在默认颁发者组 cert-manager.io 中,根据证书签名请求返回一个证书。其他组可以在 issuerRef 中指定,这将更改目标颁发者到您可能已安装的其他外部第三方颁发者。

该资源还提供了指定证书为 CA、密钥用途以及请求的有效期选项。

CertificateRequestspec 中的所有字段,以及任何受管理的 cert-manager 注释,都是不可变的,在创建后无法修改。

成功发行证书签名请求将导致资源更新,将已签署证书、证书的 CA(如果可用)设置为状态,并将 Ready 条件设置为 True

无论证书签名请求的发行成功与否,都不会再次尝试发行。管理 CertificateRequests 的逻辑和生命周期,是其他控制器的责任。

条件

CertificateRequests 有一组严格定义的条件,控制器或服务应使用和依赖这些条件,以决定对资源采取哪些下一步操作。

就绪

每个就绪条件都由一对 Ready - 布尔值,和 Reason - 字符串组成。值的集合和含义如下

ReadyReason条件含义
FalsePendingCertificateRequest 当前处于挂起状态,正在等待其他操作完成。这可能是因为 Issuer 尚未存在,或者 Issuer 正在签发证书。
FalseFailed证书发行失败 - 可能是返回的证书无法解码,或者用于签署的引用颁发者实例失败。 CertificateRequest 的控制器将不会再执行任何操作,可以认为它已最终失败。
TrueIssued引用的 Issuer 已成功签发一个已签署证书。

此条件应由颁发者设置。

Denied

DeniedReason条件含义
True<审批者的名称>CertificateRequest 被审批者拒绝。此 CertificateRequest 可以认为已最终失败。

此条件应仅由审批者设置。

Approved

ApprovedReason条件含义
True<审批者的名称>CertificateRequest 已被审批者批准。此 CertificateRequest 已获批准,可以由颁发者签发。

此条件应仅由审批者设置。

InvalidRequest

InvalidRequestReason条件含义
True<某些原因>CertificateRequest 无效。此 CertificateRequest 可以认为已最终失败。

UserInfo

CertificateRequests 包含一组 UserInfo 字段作为规范的一部分,即: usernamegroupsuidextra。这些值包含创建 CertificateRequest 的用户。如果 CertificateRequestCertificate 资源创建,则该用户将是 cert-manager 本身,或者而是直接创建 CertificateRequest 的用户。

警告:这些字段由 cert-manager 管理,绝不应由其他任何东西设置或修改。创建 CertificateRequest 时,这些字段将被覆盖,任何试图修改它们的请求都将被拒绝。

审批

CertificateRequests 可以 ApprovedDenied。这些相互排斥的条件阻止了证书请求被其受管理的签名者签署。

  • 签名者 *不应* 在没有 Approved 条件的情况下签署受管理的证书请求
  • 签名者 *将* 在有 Approved 条件的情况下签署受管理的证书请求
  • 签名者 *永远不会* 在有 Denied 条件的情况下签署受管理的证书请求

这些条件是 *永久性的*,设置后无法修改或更改。

NAMESPACE NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
istio-system service-mesh-ca-whh5b True True mesh-ca system:serviceaccount:istio-system:istiod 16s
istio-system my-app-fj9sa True mesh-ca system:serviceaccount:my-app:my-app 4s

行为

Approved 和 Denied 条件是证书请求上的两种不同的条件类型。这些条件只能具有 True 状态,并且是相互排斥的(即,证书请求不能同时具有 Approved 和 Denied 条件)。此行为在 cert-manager 验证的准入 Webhook 中强制执行。

“审批者”是指负责设置 Approved/Denied 条件的实体。由审批者实施决定哪个证书请求由该审批者管理。

Approved/Denied 条件的 Reason 字段应设置为 *谁* 设置了该条件。谁可以根据审批者实施的含义进行解释。例如,它可能包括批准策略控制器的 API 组,或手动请求的客户端代理。

Approved/Denied 条件的 Message 字段应设置为 *为什么* 设置了该条件。同样,为什么可以根据审批者实施的含义进行解释。例如,批准此请求的资源的名称、导致请求被拒绝的违规行为,或手动批准此请求的团队。

审批者控制器

默认情况下,cert-manager 将运行一个内部审批控制器,该控制器将自动批准引用任何命名空间中的任何内部颁发者类型的 *所有* 证书请求: cert-manager.io/Issuercert-manager.io/ClusterIssuer

禁用内部自动审批者

要禁用此控制器,请在 Helm 图表中将 disableAutoApproval 值设置为 true

# ⚠️ This Helm option is only available in cert-manager v1.15.0 and later.
--set disableAutoApproval=true

使用内部自动审批器批准额外的颁发者

或者,为了让内部审批器控制器批准引用外部颁发者的证书请求,在 Helm 图表中将颁发者添加到 approveSignerNames 列表中,或者将 approveSignerNames 值设置为空列表以批准所有颁发者(内部和外部)。

# ⚠️ This Helm option is only available in cert-manager v1.15.0 and later.
--set approveSignerNames[0]="issuers.cert-manager.io/*" \
--set approveSignerNames[1]="clusterissuers.cert-manager.io/*" \
\
--set approveSignerNames[2]="issuers.my-issuer.example.com/*" \
--set approveSignerNames[3]="clusterissuers.my-issuer.example.com/*"

RBAC 语法

当用户或控制器尝试批准或拒绝证书请求时,cert-manager webhook 将评估其是否拥有足够的权限来执行此操作。这些权限基于请求本身,具体而言是请求的 IssuerRef。

apiGroups: ["cert-manager.io"]
resources: ["signers"]
verbs: ["approve"]
resourceNames:
# namesapced signers
- "<signer-resource-name>.<signer-group>/<signer-namespace>.<signer-name>"
# cluster scoped signers
- "<signer-resource-name>.<signer-group>/<signer-name>"
# all signers of this resource name
- "<signer-resource-name>.<signer-group>/*"

一个示例 ClusterRole,它将授予设置引用集群范围的 myissuers 外部颁发者的证书请求的已批准和已拒绝条件的权限,该颁发者位于 my-example.io 组中,名称为 myapp

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: my-example-io-my-issuer-myapp-approver
rules:
- apiGroups: ["cert-manager.io"]
resources: ["signers"]
verbs: ["approve"]
resourceNames: ["myissuers.my-example.io/myapp"]

如果审批器没有上面定义的足够权限来设置已批准或已拒绝条件,则请求将被 cert-manager 验证的准入 webhook 拒绝。

  • RBAC 权限必须在集群范围内授予
  • 命名空间签署者由使用以下语法的命名空间资源表示:<signer-resource-name>.<signer-group>/<signer-namespace>.<signer-name>
  • 集群范围的签署者使用以下语法表示:<signer-resource-name>.<signer-group>/<signer-name>
  • 可以通过 <signer-resource-name>.<signer-group>/* 为所有命名空间授予审批器批准权限。
  • apiGroup 始终必须是 cert-manager.io
  • 资源始终必须是 signers
  • 动词始终必须是 approve,这将授予审批器设置已批准已拒绝条件的权限。

一个签署所有命名空间中的所有 myissuer 签署者,以及名称为 clustermyissuersmyapp,位于 my-example.io 组中的示例。

resourceNames: ["myissuers.my-example.io/*", "clustermyissuers.my-example.io/myapp"]

一个在命名空间 foobar 中签署名称为 myappmyissuer 的示例。

resourceNames: ["myissuers.my-example.io/foo.myapp", "myissuers.my-example.io/bar.myapp"]

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