diff --git a/content/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests.md b/content/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests.md index 423f19ac87..2a15b2391b 100644 --- a/content/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests.md +++ b/content/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests.md @@ -1,5 +1,5 @@ --- -title: 证书签名请求 +title: 证书和证书签名请求 content_type: concept weight: 25 --- @@ -9,7 +9,7 @@ reviewers: - mikedanese - munnerz - enj -title: Certificate Signing Requests +title: Certificates and Certificate Signing Requests content_type: concept weight: 25 --> @@ -19,33 +19,41 @@ weight: 25 {{< feature-state for_k8s_version="v1.19" state="stable" >}} -证书 API 支持 -[X.509](https://www.itu.int/rec/T-REC-X.509) -的自动化配置, -它为 Kubernetes API 的客户端提供一个编程接口, -用于从证书颁发机构(CA)请求并获取 X.509 -{{< glossary_tooltip term_id="certificate" text="证书" >}}。 +Kubernetes 证书和信任包(trust bundle)API 可以通过为 Kubernetes API 的客户端提供编程接口, +实现 [X.509](https://www.itu.int/rec/T-REC-X.509) 凭据的自动化制备, +从而请求并获取证书颁发机构 (CA) 发布的 X.509 {{< glossary_tooltip term_id="certificate" text="证书" >}}。 -CertificateSigningRequest(CSR)资源用来向指定的签名者申请证书签名, -在最终签名之前,申请可能被批准,也可能被拒绝。 +此外,Kubernetes 还对分发[信任包](#cluster-trust-bundles)提供了实验性(Alpha)支持。 +## 证书签名请求 {#certificate-signing-requests} + +{{< feature-state for_k8s_version="v1.19" state="stable" >}} + + +CertificateSigningRequest(CSR)资源用来向指定的签名者申请证书签名, +在最终签名之前,申请可能被批准,也可能被拒绝。 + + -## 请求签名流程 {#request-signing-process} +### 请求签名流程 {#request-signing-process} -CertificateSigningRequest 资源类型允许客户使用它申请发放 X.509 证书。 -CertificateSigningRequest 对象 在 `spec.request` 中包含一个 PEM 编码的 PKCS#10 签名请求。 +CertificateSigningRequest 资源类型允许客户端基于签名请求申请发放 X.509 证书。 +CertificateSigningRequest 对象在 `spec.request` 字段中包含一个 PEM 编码的 PKCS#10 签名请求。 CertificateSigningRequest 使用 `spec.signerName` 字段标示签名者(请求的接收方)。 注意,`spec.signerName` 在 `certificates.k8s.io/v1` 之后的 API 版本是必填项。 在 Kubernetes v1.22 和以后的版本,客户可以可选地设置 `spec.expirationSeconds` @@ -124,21 +132,96 @@ state for some duration: * 挂起的请求:24 小时后自动删除 * 所有请求:在颁发的证书过期后自动删除 + +### 证书签名鉴权 {#authorization} + +授权创建 CertificateSigningRequest 和检索 CertificateSigningRequest: + +* verbs(动词): `create`、`get`、`list`、`watch`, + group(组):`certificates.k8s.io`, + resource(资源):`certificatesigningrequests` + +例如: + +{{< codenew file="access/certificate-signing-request/clusterrole-create.yaml" >}} + + +授权批准 CertificateSigningRequest: + +* verbs(动词): `get`、`list`、`watch`, + group(组):`certificates.k8s.io`, + resource(资源):`certificatesigningrequests` +* verbs(动词): `update`, + group(组):`certificates.k8s.io`, + resource(资源):`certificatesigningrequests/approval` +* verbs(动词):`approve`, + group(组):`certificates.k8s.io`, + resource(资源):`signers`, + resourceName:`/` 或 `/*` + +例如: + +{{< codenew file="access/certificate-signing-request/clusterrole-approve.yaml" >}} + + +授权签名 CertificateSigningRequest: + +* verbs(动词):`get`、`list`、`watch`, + group(组):`certificates.k8s.io`, + resource(资源):`certificatesigningrequests` +* verbs(动词):`update`, + group(组):`certificates.k8s.io`, + resource(资源):`certificatesigningrequests/status` +* verbs(动词):`sign`, + group(组):`certificates.k8s.io`, + resource(资源):`signers`, + resourceName:`/` 或 `/*` + +{{< codenew file="access/certificate-signing-request/clusterrole-sign.yaml" >}} + ## 签名者 {#signers} -也可以指定自定义 signerName。 -所有签名者都应该提供自己工作方式的信息, -以便客户端可以预期到他们的 CSR 将发生什么。 -此类信息包括: +签名者抽象地代表可能签署或已签署安全证书的一个或多个实体。 + +任何要在特定集群以外提供的签名者都应该提供关于签名者工作方式的信息, +以便消费者可以理解这对于 CertifcateSigningRequests 和(如果启用的) +[ClusterTrustBundles](#cluster-trust-bundles) 的意义。此类信息包括: -1. **信任分发**:信任(CA 证书包)是如何分发的。 +1. **信任分发**:信任锚点(CA 证书或证书包)是如何分发的。 1. **许可的主体**:当一个受限制的主体(subject)发送请求时,相应的限制和应对手段。 1. **许可的 x509 扩展**:包括 IP subjectAltNames、DNS subjectAltNames、 Email subjectAltNames、URI subjectAltNames 等,请求一个受限制的扩展项时的应对手段。 @@ -157,19 +240,27 @@ This includes: 1. **允许/不允许 CA 位**:当 CSR 包含一个签名者并不允许的 CA 证书的请求时,相应的应对手段。 -一般来说,当 CSR 被批准通过,且证书被签名后,`status.certificate` 字段 -将包含一个 PEM 编码的 X.509 证书。 +一般来说,当 CSR 被批准通过,且证书被签名后,CertificateSigningRequest +的 `status.certificate` 字段将包含一个 PEM 编码的 X.509 证书。 有些签名者在 `status.certificate` 字段中存储多个证书。 在这种情况下,签名者的说明文档应当指明附加证书的含义。 例如,这是要在 TLS 握手时提供的证书和中继证书。 + +如果要让**信任锚点**(根证书)可用,应该将其与 CertificateSigningRequest 及其 `status.certificate` +字段分开处理。例如,你可以使用 ClusterTrustBundle。 + +kube-controller-manager 为每个内置签名者实现了[控制平面签名](#signer-control-plane)。 注意:所有这些故障仅在 kube-controller-manager 日志中报告。 -{{< /note >}} {{< note >}} -## 鉴权 {#authorization} +## 签名 {#signing} -授权创建 CertificateSigningRequest 和检索 CertificateSigningRequest: +### 控制平面签名者 {#signer-control-plane} -* verbs(动词): `create`、`get`、`list`、`watch`, - group(组):`certificates.k8s.io`, - resources:`certificatesigningrequests` +Kubernetes 控制平面实现了每一个 +[Kubernetes 签名者](/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers), +每个签名者的实现都是 kube-controller-manager 的一部分。 -例如: +{{< note >}} + +在 Kubernetes v1.18 之前, +kube-controller-manager 签名所有标记为 approved 的 CSR。 +{{< /note >}} -{{< codenew file="access/certificate-signing-request/clusterrole-create.yaml" >}} +{{< note >}} + +`spec.expirationSeconds` 字段是在 Kubernetes v1.22 中加入的。早期的 Kubernetes 版本并不认识该字段。 +v1.22 版本之前的 Kubernetes API 服务器会在创建对象的时候忽略该字段。 +{{< /note >}} -授权批准 CertificateSigningRequest: +### 基于 API 的签名者 {#signer-api} -* verbs(动词): `get`、`list`、`watch`, - group(组):`certificates.k8s.io`, - resources(资源):`certificatesigningrequests` -* verbs(动词): `update`, - group(组):`certificates.k8s.io`, - resources(资源):`certificatesigningrequests/approval` -* verbs(动词):`approve`, - group(组):`certificates.k8s.io`, - resources(资源):`signers`, - resourceName:`/` 或 `/*` +REST API 的用户可以通过向待签名的 CSR 的 `status` 子资源提交更新请求来对 CSR 进行签名。 -例如: +作为这个请求的一部分,`status.certificate` 字段应设置为已签名的证书。 +此字段可包含一个或多个 PEM 编码的证书。 -{{< codenew file="access/certificate-signing-request/clusterrole-approve.yaml" >}} +所有的 PEM 块必须具备 "CERTIFICATE" 标签,且不包含文件头,且编码的数据必须是 +[RFC5280 第 4 节](https://tools.ietf.org/html/rfc5280#section-4.1) +中描述的 BER 编码的 ASN.1 证书结构。 + +证书内容示例: + +``` +-----BEGIN CERTIFICATE----- +MIIDgjCCAmqgAwIBAgIUC1N1EJ4Qnsd322BhDPRwmg3b/oAwDQYJKoZIhvcNAQEL +BQAwXDELMAkGA1UEBhMCeHgxCjAIBgNVBAgMAXgxCjAIBgNVBAcMAXgxCjAIBgNV +BAoMAXgxCjAIBgNVBAsMAXgxCzAJBgNVBAMMAmNhMRAwDgYJKoZIhvcNAQkBFgF4 +MB4XDTIwMDcwNjIyMDcwMFoXDTI1MDcwNTIyMDcwMFowNzEVMBMGA1UEChMMc3lz +dGVtOm5vZGVzMR4wHAYDVQQDExVzeXN0ZW06bm9kZToxMjcuMC4wLjEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDne5X2eQ1JcLZkKvhzCR4Hxl9+ZmU3 ++e1zfOywLdoQxrPi+o4hVsUH3q0y52BMa7u1yehHDRSaq9u62cmi5ekgXhXHzGmm +kmW5n0itRECv3SFsSm2DSghRKf0mm6iTYHWDHzUXKdm9lPPWoSOxoR5oqOsm3JEh +Q7Et13wrvTJqBMJo1GTwQuF+HYOku0NF/DLqbZIcpI08yQKyrBgYz2uO51/oNp8a +sTCsV4OUfyHhx2BBLUo4g4SptHFySTBwlpRWBnSjZPOhmN74JcpTLB4J5f4iEeA7 +2QytZfADckG4wVkhH3C2EJUmRtFIBVirwDn39GXkSGlnvnMgF3uLZ6zNAgMBAAGj +YTBfMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjAMBgNVHRMB +Af8EAjAAMB0GA1UdDgQWBBTREl2hW54lkQBDeVCcd2f2VSlB1DALBgNVHREEBDAC +ggAwDQYJKoZIhvcNAQELBQADggEBABpZjuIKTq8pCaX8dMEGPWtAykgLsTcD2jYr +L0/TCrqmuaaliUa42jQTt2OVsVP/L8ofFunj/KjpQU0bvKJPLMRKtmxbhXuQCQi1 +qCRkp8o93mHvEz3mTUN+D1cfQ2fpsBENLnpS0F4G/JyY2Vrh19/X8+mImMEK5eOy +o0BMby7byUj98WmcUvNCiXbC6F45QTmkwEhMqWns0JZQY+/XeDhEcg+lJvz9Eyo2 +aGgPsye1o3DpyXnyfJWAWMhOz7cikS5X2adesbgI86PhEHBXPIJ1v13ZdfCExmdd +M1fLPhLyR54fGaY+7/X8P9AZzPefAkwizeXwe9ii6/a08vWoiE4= +-----END CERTIFICATE----- +``` -授权签名 CertificateSigningRequest: +非 PEM 内容可能会出现在证书 PEM 块前后的位置,且未经验证, +以允许使用 [RFC7468 第 5.2 节](https://www.rfc-editor.org/rfc/rfc7468#section-5.2)中描述的解释性文本。 -* verbs(动词):`get`、`list`、`watch`, - group(组):`certificates.k8s.io`, - resources(资源):`certificatesigningrequests` -* verbs(动词):`update`, - group(组):`certificates.k8s.io`, - resources(资源):`certificatesigningrequests/status` -* verbs(动词):`sign`, - group(组):`certificates.k8s.io`, - resources(资源):`signers`, - resourceName:`/` 或 `/*` +当使用 JSON 或 YAML 格式时,此字段是 base-64 编码。 +包含上述示例证书的 CertificateSigningRequest 如下所示: -{{< codenew file="access/certificate-signing-request/clusterrole-sign.yaml" >}} +```yaml +apiVersion: certificates.k8s.io/v1 +kind: CertificateSigningRequest +... +status: + certificate: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JS..." +``` +## 批准和驳回 {#approval-rejection} + +[签名者](#signers)基于 CertificateSigningRequest 签发证书之前, +通常会检查 CSR 的签发是否已被**批准**。 + +### 控制平面的自动化批准 {#approval-rejection-control-plane} + +kube-controller-manager 内建了一个证书批准者,其 signerName 为 +`kubernetes.io/kube-apiserver-client-kubelet`, +该批准者将 CSR 上用于节点凭据的各种权限委托给权威认证机构。 +kube-controller-manager 将 SubjectAccessReview 资源发送(POST)到 API 服务器, +以便检验批准证书的授权。 + + +### 使用 `kubectl` 批准或驳回 {#approval-rejection-kubectl} + +Kubernetes 管理员(拥有足够的权限)可以手工批准(或驳回)CertificateSigningRequests, +此操作使用 `kubectl certificate approve` 和 `kubectl certificate deny` 命令实现。 + +使用 kubectl 批准一个 CSR: + +```shell +kubectl certificate approve +``` + + +同样地,驳回一个 CSR: + +```shell +kubectl certificate deny +``` + + +### 使用 Kubernetes API 批准或驳回 {#approval-rejection-api-client} + +REST API 的用户可以通过向待批准的 CSR 的 `approval` 子资源提交更新请求来批准 CSR。 +例如,你可以编写一个 +{{< glossary_tooltip term_id="operator-pattern" text="operator" >}} +来监视特定类型的 CSR,然后发送一个更新来批准它。 + +当你发出批准或驳回的指令时,根据你期望的状态来选择设置 `Approved` 或 `Denied`。 + +批准(`Approved`) 的 CSR: + + +```yaml +apiVersion: certificates.k8s.io/v1 +kind: CertificateSigningRequest +... +status: + conditions: + - lastUpdateTime: "2020-02-08T11:37:35Z" + lastTransitionTime: "2020-02-08T11:37:35Z" + message: Approved by my custom approver controller + reason: ApprovedByMyPolicy # 你可以将此字段设置为任意字符串 + type: Approved +``` + + +驳回(`Denied`)的 CSR: + + +```yaml +apiVersion: certificates.k8s.io/v1 +kind: CertificateSigningRequest +... +status: + conditions: + - lastUpdateTime: "2020-02-08T11:37:35Z" + lastTransitionTime: "2020-02-08T11:37:35Z" + message: Denied by my custom approver controller + reason: DeniedByMyPolicy # 你可以将此字段设置为任意字符串 + type: Denied +``` + + +`status.conditions.reason` 字段通常设置为一个首字母大写的对机器友好的原因码; +这是一个命名约定,但你也可以随你的个人喜好设置。 +如果你想添加一个供人类使用的注释,那就用 `status.conditions.message` 字段。 + + +## 集群信任包 {#cluster-trust-bundles} + +{{< feature-state for_k8s_version="v1.27" state="alpha" >}} + +{{< note >}} + +在 Kubernetes {{< skew currentVersion >}} 中,如果想要使用此 API, +必须同时启用 `ClusterTrustBundles` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/) +**以及** `certificates.k8s.io/v1alpha1` {{< glossary_tooltip text="API 组" term_id="api-group" >}}。 +{{< /note >}} + + +ClusterTrustBundles 是一个作用域为集群的对象,向集群内的对象分发 X.509 信任锚点(根证书)。 +此对象旨在与 CertificateSigningRequests 中的[签名者](#signers)概念协同工作。 + +ClusterTrustBundles 可以使用两种模式: +[签名者关联](#ctb-signer-linked)和[签名者未关联](#ctb-signer-unlinked)。 + + +### 常见属性和验证 {#ctb-common} + +所有 ClusterTrustBundle 对象都对其 `trustBundle` 字段的内容进行强大的验证。 +该字段必须包含一个或多个经 DER 序列化的 X.509 证书,每个证书都封装在 PEM `CERTIFICATE` 块中。 +这些证书必须解析为有效的 X.509 证书。 + +诸如块间数据和块内标头之类的 PEM 特性在对象验证期间要么被拒绝,要么可能被对象的消费者忽略。 +此外,消费者被允许使用自己的任意但稳定的排序方式重新排序 bundle 中的证书。 + + +ClusterTrustBundle 对象应该在集群内被视为全局可读的。 +如果集群使用 [RBAC](/zh-cn/docs/reference/access-authn-authz/rbac/) 鉴权, +则所有 ServiceAccount 都具有默认授权,允许它们 **get**、**list** 和 **watch** +所有 ClusterTrustBundle 对象。如果你使用自己的鉴权机制,并且在集群中启用了 +ClusterTrustBundles,则应设置等效规则以使这些对象在集群内公开,使这些对象按预期工作。 + +如果你没有默认在集群中列出集群信任包的权限,则可以扮演具有访问权限的 ServiceAccount, +以查看可用的 ClusterTrustBundle: + +```bash +kubectl get clustertrustbundles --as='system:serviceaccount:mynamespace:default' +``` + + +### 签名者关联的 ClusterTrustBundles {#ctb-signer-linked} + +签名者关联的 ClusterTrustBundles 与**签名者名称**关联,例如: + +```yaml +apiVersion: certificates.k8s.io/v1alpha1 +kind: ClusterTrustBundle +metadata: + name: example.com:mysigner:foo +spec: + signerName: example.com/mysigner + trustBundle: "<... PEM data ...>" +``` + + +这些 ClusterTrustBundle 预期由集群中的特定签名者控制器维护,因此它们具有多个安全特性: + + +* 要创建或更新与一个签名者关联的 ClusterTrustBundle,你必须获准**证明**该签名者 + (自定义鉴权动词 `attest` API 组 `certificates.k8s.io`;资源路径 `signers`)。 + 你可以为特定资源名称 `/` 或匹配 `/*` 等模式来配置鉴权。 +* 与签名者关联的 ClusterTrustBundle **必须**使用从其 `spec.signerName` 字段派生的前缀命名。 + 斜杠 (`/`) 被替换为英文冒号 (`:`),最后追加一个英文冒号。后跟任意名称。 + 例如,签名者 `example.com/mysigner` 可以关联到 ClusterTrustBundle `example.com:mysigner:`。 + + +与签名者关联的 ClusterTrustBundle 通常通过组合签名者名称有关的 +[字段选择算符](/zh-cn/docs/concepts/overview/working-with-objects/field-selectors/) +或单独使用[标签选择算符](/zh-cn/docs/concepts/overview/working-with-objects/labels/#label-selectors)在工作负载中被消耗。 + + +### 签名者未关联的 ClusterTrustBundles {#ctb-signer-unlinked} + +签名者未关联的 ClusterTrustBundles 具有空白的 `spec.signerName` 字段,例如: + + +```yaml +apiVersion: certificates.k8s.io/v1alpha1 +kind: ClusterTrustBundle +metadata: + name: foo +spec: + # 未指定 signerName 所以该字段留空 + trustBundle: "<... PEM data ...>" +``` + + +它们主要用于集群配置场景。每个与签名者未关联的 ClusterTrustBundle 都是一个独立的对象, +与签名者关联的 ClusterTrustBundle 的惯常分组行为形成了对比。 + +与签名者为关联的 ClusterTrustBundle 没有 `attest` 动词要求。 +相反,你可以使用通常的机制(如基于角色的访问控制)直接控制对它们的访问。 + +为了将它们与与签名者关联的 ClusterTrustBundle 区分开来,与签名者未关联的 +ClusterTrustBundle 的名称**必须不**包含英文冒号 (`:`)。 + + + + -## 普通用户 {#normal-user} +## 如何为用户签发证书 {#normal-user} 为了让普通用户能够通过认证并调用 API,需要执行几个步骤。 首先,该用户必须拥有 Kubernetes 集群签发的证书, @@ -441,7 +882,7 @@ openssl req -new -key myuser.key -out myuser.csr ``` @@ -471,7 +912,7 @@ Some points to note: - `usages` has to be '`client auth`' - `expirationSeconds` could be made longer (i.e. `864000` for ten days) or shorter (i.e. `3600` for one hour) - `request` is the base64 encoded value of the CSR file content. - You can get the content using this command: + You can get the content using this command: --> 需要注意的几点: @@ -485,13 +926,13 @@ Some points to note: ``` -### 批准证书签名请求 {#approve-certificate-signing-request} +### 批准 CertificateSigningRequest {#approve-certificate-signing-request} 使用 kubectl 创建 CSR 并批准。 @@ -527,7 +968,6 @@ kubectl get csr/myuser -o yaml The certificate value is in Base64-encoded format under `status.certificate`. Export the issued certificate from the CertificateSigningRequest. - --> 证书的内容使用 base64 编码,存放在字段 `status.certificate`。 @@ -601,228 +1041,6 @@ To test it, change the context to `myuser`: kubectl config use-context myuser ``` - -## 批准和驳回 {#approval-rejection} - -### 控制平面的自动化批准 {#approval-rejection-control-plane} - -kube-controller-manager 内建了一个证书批准者,其 signerName 为 -`kubernetes.io/kube-apiserver-client-kubelet`, -该批准者将 CSR 上用于节点凭据的各种权限委托给权威认证机构。 -kube-controller-manager 将 SubjectAccessReview 资源发送(POST)到 API 服务器, -以便检验批准证书的授权。 - - -### 使用 `kubectl` 批准或驳回 {#approval-rejection-kubectl} - -Kubernetes 管理员(拥有足够的权限)可以手工批准(或驳回)CertificateSigningRequests, -此操作使用 `kubectl certificate approve` 和 `kubectl certificate deny` 命令实现。 - -使用 kubectl 批准一个 CSR: - -```shell -kubectl certificate approve -``` - - -同样地,驳回一个 CSR: - -```shell -kubectl certificate deny -``` - - -### 使用 Kubernetes API 批准或驳回 {#approval-rejection-api-client} - -REST API 的用户可以通过向待批准的 CSR 的 `approval` 子资源提交更新请求来批准 CSR。 -例如,你可以编写一个 -{{< glossary_tooltip term_id="operator-pattern" text="operator" >}} -来监视特定类型的 CSR,然后发送一个更新来批准它。 - -当你发出批准或驳回的指令时,根据你期望的状态来选择设置 `Approved` 或 `Denied`。 - -批准(`Approved`) 的 CSR: - -```yaml -apiVersion: certificates.k8s.io/v1 -kind: CertificateSigningRequest -... -status: - conditions: - - lastUpdateTime: "2020-02-08T11:37:35Z" - lastTransitionTime: "2020-02-08T11:37:35Z" - message: Approved by my custom approver controller - reason: ApprovedByMyPolicy # You can set this to any string - type: Approved -``` - - -驳回(`Denied`)的 CSR: - -```yaml -apiVersion: certificates.k8s.io/v1 -kind: CertificateSigningRequest -... -status: - conditions: - - lastUpdateTime: "2020-02-08T11:37:35Z" - lastTransitionTime: "2020-02-08T11:37:35Z" - message: Denied by my custom approver controller - reason: DeniedByMyPolicy # You can set this to any string - type: Denied -``` - - -`status.conditions.reason` 字段通常设置为一个首字母大写的对机器友好的原因码; -这是一个命名约定,但你也可以随你的个人喜好设置。 -如果你想添加一个供人类使用的注释,那就用 `status.conditions.message` 字段。 - - -## 签名 {#signing} - -### 控制平面签名者 {#signer-control-plane} - -Kubernetes 控制平面实现了每一个 -[Kubernetes 签名者](/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers), -每个签名者的实现都是 kube-controller-manager 的一部分。 - -{{< note >}} - -在 Kubernetes v1.18 之前, -kube-controller-manager 签名所有标记为 approved 的 CSR。 -{{< /note >}} - -{{< note >}} - -`spec.expirationSeconds` 字段是在 Kubernetes v1.22 中加入的。早期的 Kubernetes 版本并不认识该字段。 -v1.22 版本之前的 Kubernetes API 服务器会在创建对象的时候忽略该字段。 -{{< /note >}} - - -### 基于 API 的签名者 {#signer-api} - -REST API 的用户可以通过向待签名的 CSR 的 `status` 子资源提交更新请求来对 CSR 进行签名。 - -作为这个请求的一部分,`status.certificate` 字段应设置为已签名的证书。 -此字段可包含一个或多个 PEM 编码的证书。 - -所有的 PEM 块必须具备 "CERTIFICATE" 标签,且不包含文件头,且编码的数据必须是 -[RFC5280 第 4 节](https://tools.ietf.org/html/rfc5280#section-4.1) -中描述的 BER 编码的 ASN.1 证书结构。 - -``` ------BEGIN CERTIFICATE----- -MIIDgjCCAmqgAwIBAgIUC1N1EJ4Qnsd322BhDPRwmg3b/oAwDQYJKoZIhvcNAQEL -BQAwXDELMAkGA1UEBhMCeHgxCjAIBgNVBAgMAXgxCjAIBgNVBAcMAXgxCjAIBgNV -BAoMAXgxCjAIBgNVBAsMAXgxCzAJBgNVBAMMAmNhMRAwDgYJKoZIhvcNAQkBFgF4 -MB4XDTIwMDcwNjIyMDcwMFoXDTI1MDcwNTIyMDcwMFowNzEVMBMGA1UEChMMc3lz -dGVtOm5vZGVzMR4wHAYDVQQDExVzeXN0ZW06bm9kZToxMjcuMC4wLjEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDne5X2eQ1JcLZkKvhzCR4Hxl9+ZmU3 -+e1zfOywLdoQxrPi+o4hVsUH3q0y52BMa7u1yehHDRSaq9u62cmi5ekgXhXHzGmm -kmW5n0itRECv3SFsSm2DSghRKf0mm6iTYHWDHzUXKdm9lPPWoSOxoR5oqOsm3JEh -Q7Et13wrvTJqBMJo1GTwQuF+HYOku0NF/DLqbZIcpI08yQKyrBgYz2uO51/oNp8a -sTCsV4OUfyHhx2BBLUo4g4SptHFySTBwlpRWBnSjZPOhmN74JcpTLB4J5f4iEeA7 -2QytZfADckG4wVkhH3C2EJUmRtFIBVirwDn39GXkSGlnvnMgF3uLZ6zNAgMBAAGj -YTBfMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBTREl2hW54lkQBDeVCcd2f2VSlB1DALBgNVHREEBDAC -ggAwDQYJKoZIhvcNAQELBQADggEBABpZjuIKTq8pCaX8dMEGPWtAykgLsTcD2jYr -L0/TCrqmuaaliUa42jQTt2OVsVP/L8ofFunj/KjpQU0bvKJPLMRKtmxbhXuQCQi1 -qCRkp8o93mHvEz3mTUN+D1cfQ2fpsBENLnpS0F4G/JyY2Vrh19/X8+mImMEK5eOy -o0BMby7byUj98WmcUvNCiXbC6F45QTmkwEhMqWns0JZQY+/XeDhEcg+lJvz9Eyo2 -aGgPsye1o3DpyXnyfJWAWMhOz7cikS5X2adesbgI86PhEHBXPIJ1v13ZdfCExmdd -M1fLPhLyR54fGaY+7/X8P9AZzPefAkwizeXwe9ii6/a08vWoiE4= ------END CERTIFICATE----- -``` - - -非 PEM 内容可能会出现在证书 PEM 块前后的位置,且未经验证, -以允许使用 [RFC7468 第 5.2 节](https://www.rfc-editor.org/rfc/rfc7468#section-5.2)中描述的解释性文本。 - -当使用 JSON 或 YAML 格式时,此字段是 base-64 编码。 -包含上述示例证书的 CertificateSigningRequest 如下所示: - -```yaml -apiVersion: certificates.k8s.io/v1 -kind: CertificateSigningRequest -... -status: - certificate: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JS..." -``` - ## {{% heading "whatsnext" %}}