证书请求资源
apiVersion: cert-manager.io/v1
kind: CertificateRequest
CertificateRequest
是 cert-manager 中一个命名空间资源,用于从 Issuer
请求 X.509 证书。该资源包含一个 PEM 编码的证书请求的 base64 编码字符串,该字符串将发送到引用的颁发者。成功发行将返回一个基于证书签名请求的已签署证书。 CertificateRequests
通常由控制器或其他系统使用和管理,不应由人类使用 - 除非特别需要。
一个简单的 CertificateRequest
如下所示
apiVersion: cert-manager.io/v1kind: CertificateRequestmetadata:name: my-ca-crspec:request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQzNqQ0NBY1lDQVFBd2daZ3hDekFKQmdOVkJBWVRBbHBhTVE4d0RRWURWUVFJREFaQmNHOXNiRzh4RFRBTApCZ05WQkFjTUJFMXZiMjR4RVRBUEJnTlZCQW9NQ0VwbGRITjBZV05yTVJVd0V3WURWUVFMREF4alpYSjBMVzFoCmJtRm5aWEl4RVRBUEJnTlZCQU1NQ0dwdmMyaDJZVzVzTVN3d0tnWUpLb1pJaHZjTkFRa0JGaDFxYjNOb2RXRXUKZG1GdWJHVmxkWGRsYmtCcVpYUnpkR0ZqYXk1cGJ6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFLd01tTFhuQkNiRStZdTIvMlFtRGsxalRWQ3BvbHU3TlZmQlVFUWl1bDhFMHI2NFBLcDRZQ0c5Cmx2N2kwOHdFMEdJQUgydnJRQmxVd3p6ZW1SUWZ4YmQvYVNybzRHNUFBYTJsY2NMaFpqUlh2NEVMaER0aVg4N3IKaTQ0MWJ2Y01OM0ZPTlRuczJhRkJYcllLWGxpNG4rc0RzTEVuZmpWdXRiV01Zeis3M3ptaGZzclRJUjRzTXo3cQpmSzM2WFM4UkRjNW5oVVcyYU9BZ3lnbFZSOVVXRkxXNjNXYXVhcHg2QUpBR1RoZnJYdVVHZXlZUUVBSENxZmZmCjhyOEt3YTFYK1NwYm9YK1ppSVE0Nk5jQ043OFZnL2dQVHNLZmphZURoNWcyNlk1dEVidHd3MWdRbWlhK0MyRHIKWHpYNU13RzJGNHN0cG5kUnRQckZrU1VnMW1zd0xuc0NBd0VBQWFBQU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUFXR0JuRnhaZ0gzd0N3TG5IQ0xjb0l5RHJrMUVvYkRjN3BJK1VVWEJIS2JBWk9IWEFhaGJ5RFFLL2RuTHN3CjJkZ0J3bmlJR3kxNElwQlNxaDBJUE03eHk5WjI4VW9oR3piN0FVakRJWHlNdmkvYTJyTVhjWjI1d1NVQmxGc28Kd005dE1QU2JwcEVvRERsa3NsOUIwT1BPdkFyQ0NKNnZGaU1UbS9wMUJIUWJSOExNQW53U0lUYVVNSFByRzJVMgpjTjEvRGNMWjZ2enEyeENjYVoxemh2bzBpY1VIUm9UWmV1ZEp6MkxmR0VHM1VOb2ppbXpBNUZHd0RhS3BySWp3ClVkd1JmZWZ1T29MT1dNVnFNbGRBcTlyT24wNHJaT3Jnak1HSE9tTWxleVdPS1AySllhaDNrVDdKU01zTHhYcFYKV0ExQjRsLzFFQkhWeGlKQi9Zby9JQWVsCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=isCA: falseusages:- signing- digital signature- server auth# 90 daysduration: 2160hissuerRef:name: ca-issuer# We can reference ClusterIssuers by changing the kind here.# The default value is Issuer (i.e. a locally namespaced Issuer)kind: Issuergroup: cert-manager.io
此 CertificateRequest
将使 cert-manager 尝试请求 Issuer
ca-issuer
在默认颁发者组 cert-manager.io
中,根据证书签名请求返回一个证书。其他组可以在 issuerRef
中指定,这将更改目标颁发者到您可能已安装的其他外部第三方颁发者。
该资源还提供了指定证书为 CA、密钥用途以及请求的有效期选项。
CertificateRequest
的 spec
中的所有字段,以及任何受管理的 cert-manager 注释,都是不可变的,在创建后无法修改。
成功发行证书签名请求将导致资源更新,将已签署证书、证书的 CA(如果可用)设置为状态,并将 Ready
条件设置为 True
。
无论证书签名请求的发行成功与否,都不会再次尝试发行。管理 CertificateRequests
的逻辑和生命周期,是其他控制器的责任。
条件
CertificateRequests
有一组严格定义的条件,控制器或服务应使用和依赖这些条件,以决定对资源采取哪些下一步操作。
就绪
每个就绪条件都由一对 Ready
- 布尔值,和 Reason
- 字符串组成。值的集合和含义如下
Ready | Reason | 条件含义 |
---|---|---|
False | Pending | CertificateRequest 当前处于挂起状态,正在等待其他操作完成。这可能是因为 Issuer 尚未存在,或者 Issuer 正在签发证书。 |
False | Failed | 证书发行失败 - 可能是返回的证书无法解码,或者用于签署的引用颁发者实例失败。 CertificateRequest 的控制器将不会再执行任何操作,可以认为它已最终失败。 |
True | Issued | 引用的 Issuer 已成功签发一个已签署证书。 |
此条件应由颁发者设置。
Denied
Denied | Reason | 条件含义 |
---|---|---|
True | <审批者的名称> | CertificateRequest 被审批者拒绝。此 CertificateRequest 可以认为已最终失败。 |
此条件应仅由审批者设置。
Approved
Approved | Reason | 条件含义 |
---|---|---|
True | <审批者的名称> | CertificateRequest 已被审批者批准。此 CertificateRequest 已获批准,可以由颁发者签发。 |
此条件应仅由审批者设置。
InvalidRequest
InvalidRequest | Reason | 条件含义 |
---|---|---|
True | <某些原因> | CertificateRequest 无效。此 CertificateRequest 可以认为已最终失败。 |
UserInfo
CertificateRequests
包含一组 UserInfo
字段作为规范的一部分,即: username
、 groups
、 uid
和 extra
。这些值包含创建 CertificateRequest
的用户。如果 CertificateRequest
由 Certificate
资源创建,则该用户将是 cert-manager 本身,或者而是直接创建 CertificateRequest
的用户。
警告:这些字段由 cert-manager 管理,绝不应由其他任何东西设置或修改。创建
CertificateRequest
时,这些字段将被覆盖,任何试图修改它们的请求都将被拒绝。
审批
CertificateRequests 可以 Approved
或 Denied
。这些相互排斥的条件阻止了证书请求被其受管理的签名者签署。
- 签名者 *不应* 在没有 Approved 条件的情况下签署受管理的证书请求
- 签名者 *将* 在有 Approved 条件的情况下签署受管理的证书请求
- 签名者 *永远不会* 在有 Denied 条件的情况下签署受管理的证书请求
这些条件是 *永久性的*,设置后无法修改或更改。
NAMESPACE NAME APPROVED DENIED READY ISSUER REQUESTOR AGEistio-system service-mesh-ca-whh5b True True mesh-ca system:serviceaccount:istio-system:istiod 16sistio-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/Issuer
、 cert-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/v1kind: ClusterRolemetadata:name: my-example-io-my-issuer-myapp-approverrules:- 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
签署者,以及名称为 clustermyissuers
的 myapp
,位于 my-example.io
组中的示例。
resourceNames: ["myissuers.my-example.io/*", "clustermyissuers.my-example.io/myapp"]
一个在命名空间 foo
和 bar
中签署名称为 myapp
的 myissuer
的示例。
resourceNames: ["myissuers.my-example.io/foo.myapp", "myissuers.my-example.io/bar.myapp"]