证书签名
Kubernetes 证书 API 支持自动化 X.509CertificateSigningRequest(CSR)资源用于请求指示签署人对证书进行签名。然后,请求在签署前被批准或拒绝。Kubernetes 支持内置签署人和具有明确定义行为的自定义签署人。这样,客户端就可以预测 CSR 会发生什么。要了解有关证书签名的更多信息,请参阅签名请求
内置签署人之一是 kubernetes.io/legacy-unknown。CSR 资源的 v1beta1 API 遵循这个旧版未知的签署人。但是,CSR 的稳定 v1 API 不允许 signerName 被设置为 kubernetes.io/legacy-unknown。
Amazon EKS 版本 1.21 和早期版本允许将值 legacy-unknown 作为 v1beta1 CSR API 中的 signerName。此 API 使 Amazon EKS 证书颁发机构(CA)能够生成证书。但是,在 Kubernetes 版本 1.22 中,v1beta1 CSR API 被 v1 CSR API 替换。此 API 不支持“旧版未知”的 signerName。鉴于此,如果您想使用 Amazon EKS CA 在版本 1.22 和更高版本上生成证书,您需要使用自定义签署人。它已在 Amazon EKS 版本 1.22 中引入。要使用 CSR v1 API 版本并生成新证书,必须迁移任何现有清单和 API 客户端。使用旧版本的 v1beta1 API 创建的现有证书在证书到期之前有效且正常运行。这包括以下这些:
-
信任分配:无。在 Kubernetes 集群中,此签署人没有标准的信任或分配。
-
允许的主题:任何
-
允许的 x509 扩展:遵循 subjectAltName 和密钥使用扩展,并丢弃其他扩展
-
允许的密钥用法:不得包括 [“密钥加密”、“数字签名”、“服务器身份验证”] 以外的用法
-
到期/证书使用寿命:1 年(默认值和最大值)
-
允许/不允许 CA 位:不允许
使用 signerName 生成 CSR 示例
这些步骤介绍如何使用 signerName:
beta.eks.amazonaws.com/app-serving 为 DNS 名称 myserver.default.svc 生成服务证书。将此用作您自己环境的指南。
-
运行
openssl genrsa -out myserver.key 2048命令以生成 RSA 私有密钥。openssl genrsa -out myserver.key 2048 -
运行以下命令以生成证书请求。
openssl req -new -key myserver.key -out myserver.csr -subj "/CN=myserver.default.svc" -
生成 CSR 请求的
base64值。稍后,您将使用此值作为 CSR 中的request值。cat myserver.csr | base64 -w 0 | tr -d "\n" -
使用以下内容创建名为
mycsr.yaml的文件。在以下示例中,beta.eks.amazonaws.com/app-serving是signerName。将替换为上一步中返回的值。base64-valueapiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: myserver spec: request:base64-valuesignerName: beta.eks.amazonaws.com/app-serving usages: - digital signature - key encipherment - server auth -
提交 CSR。
kubectl apply -fmycsr.yaml -
批准服务证书。
kubectl certificate approve myserver -
验证证书是否已颁发。
kubectl get csr myserver输出示例如下。
NAME AGE SIGNERNAME REQUESTOR CONDITION myserver 3m20s beta.eks.amazonaws.com/app-serving kubernetes-admin Approved,Issued -
导出已颁发的证书:
kubectl get csr myserver -o jsonpath='{.status.certificate}'| base64 -d >myserver.crt