diff --git a/content/zh-cn/docs/tasks/tls/certificate-issue-client-csr.md b/content/zh-cn/docs/tasks/tls/certificate-issue-client-csr.md new file mode 100644 index 0000000000..4e6c31d2eb --- /dev/null +++ b/content/zh-cn/docs/tasks/tls/certificate-issue-client-csr.md @@ -0,0 +1,318 @@ +--- +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)