--- title: 使用 CertificateSigningRequest 为 Kubernetes API 客户端颁发证书 api_metadata: - apiVersion: "certificates.k8s.io/v1" kind: "CertificateSigningRequest" override_link_text: "CSR v1" weight: 80 # 文档维护说明 # # 如果将来新增页面 /docs/tasks/tls/certificate-issue-client-manually/ # 那么需要在此页面添加新的交叉引用链接,而新增的页面也应链接回此页面 --- Kubernetes 允许你使用公钥基础设施 (PKI) 对你的集群进行身份认证,这类似于对客户端进行身份认证。 为了能够对普通用户进行身份认证并调用 API,需要执行几个步骤。首先,此用户必须拥有由你的 Kubernetes 集群所信任的权威机构颁发的 [X.509](https://www.itu.int/rec/T-REC-X.509) 证书。之后客户端必须向 Kubernetes API 提交该证书。 在这个过程中,你需要使用 [CertificateSigningRequest](/zh-cn/concepts/security/certificate-signing-requests/),并且你或其他主体必须批准此请求。 你将创建私钥,然后获取颁发的证书,最后为客户端配置该私钥。 ## {{% heading "prerequisites" %}} * {{< include "task-tutorial-prereqs.md" >}} * 你需要 `kubectl`、`openssl` 和 `base64` 等工具。 此页面假设你使用的是 Kubernetes {{< glossary_tooltip term_id="rbac" text="基于角色的访问控制" >}} (RBAC)。 如果你在鉴权方面有替代的或额外的安全机制,也需要将其考虑在内。 ## 创建私钥 {#create-private-key} 在这一步中,你将创建一个私钥。你将此文件作为秘密保管起来,因为任何拥有该私钥的人都可以伪装成对应的用户。 ```shell # 创建一个私钥 openssl genrsa -out myuser.key 3072 ``` ## 创建 X.509 证书签名请求 {#create-x.509-certificatessigningrequest} {{< note >}} 这与类似名称的 CertificateSigningRequest API 不同; 你在此处生成的文件将被放入 CertificateSigningRequest 对象中。 {{< /note >}} 设置 CSR 的 CN 和 O 属性非常重要。CN 是用户的名称,O 是此用户所属的群组。 你可以参阅 [RBAC](/zh-cn/docs/reference/access-authn-authz/rbac/) 了解标准的群组。 ```shell # 将通用名称 "myuser" 更改为你要使用的实际用户名 openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser" ``` ## 创建 Kubernetes CertificateSigningRequest {#create-k8s-certificatessigningrequest} 使用以下命令对 CSR 文档进行编码: ```shell cat myuser.csr | base64 | tr -d "\n" ``` 创建 [CertificateSigningRequest](/zh-cn/docs/reference/kubernetes-api/authentication-resources/certificate-signing-request-v1/) 并通过 kubectl 将其提交到 Kubernetes 集群。以下是你可以用于生成 CertificateSigningRequest 的 Shell 片段。 ```shell cat < 一些注意点: - `usages` 必须是 `client auth` - `expirationSeconds` 可以设置得更长(例如 `864000` 表示十天)或更短(例如 `3600` 表示一小时)。 你所请求的时长不能短于 10 分钟。 - `request` 值是 CSR 文件内容的 base64 编码值。 ## 批准 CertificateSigningRequest {#approve-certificate-signing-request} 使用 kubectl 找到你创建的 CSR,并手动批准它。 获取 CSR 列表: ```shell kubectl get csr ``` 批准 CSR: ```shell kubectl certificate approve myuser ``` ## 获取证书 {#get-the-certificate} 从 CSR 中检索证书,以检查其是否正常。 ```shell kubectl get csr/myuser -o yaml ``` 证书值以 Base64 编码格式显示在 `.status.certificate` 下。 从 CertificateSigningRequest 导出已颁发的证书。 ```shell kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt ``` ## 将证书配置到 kubeconfig 中 {#configure-the-certificate-into-kubeconfig} 下一步是将此用户添加到 kubeconfig 文件中。 首先,你需要添加新的凭证: ```shell kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true ``` 然后,你需要添加上下文: ```shell kubectl config set-context myuser --cluster=kubernetes --user=myuser ``` 对其执行测试: ```shell kubectl --context myuser auth whoami ``` 你应该看到确认你是 “myuser” 的输出。 ## 创建 Role 和 RoleBinding {#create-role-and-rolebinding} {{< note >}} 如果你不使用 Kubernetes RBAC,请跳过这一步,并对集群实际使用的鉴权机制进行适当更改。 {{< /note >}} 创建证书之后,就可以为此用户定义 Role 和 RoleBinding,以访问 Kubernetes 集群资源。 这是为新用户创建 Role 的示例命令: ```shell kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods ``` 这是为新用户创建 RoleBinding 的示例命令: ```shell kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser ``` ## {{% heading "whatsnext" %}} * 阅读[管理集群中的 TLS 证书](/zh-cn/docs/tasks/tls/managing-tls-in-a-cluster/) * 有关 X.509 本身的细节,参阅 [RFC 5280](https://tools.ietf.org/html/rfc5280#section-3.1) 第 3.1 节 * 有关 PKCS#10 证书签名请求的语法信息,请参阅 [RFC 2986](https://tools.ietf.org/html/rfc2986) * 参阅 [ClusterTrustBundles](/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#cluster-trust-bundles)