

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 Kubernetes 证书保护工作负载
<a name="cert-signing"></a>

Kubernetes 证书 API 可自动执行 [X.509](https://www.itu.int/rec/T-REC-X.509) 凭证预置。该 API 具有一个命令行界面，供 Kubernetes API 客户端从证书颁发机构（CA）请求和获取 [X.509 证书](https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/)。您可以使用 `CertificateSigningRequest`（CSR）资源请求指示签署人对证书进行签名。您的请求在签署前获得批准或被拒绝。Kubernetes 支持内置签署人和具有明确定义行为的自定义签署人。这样，客户端就可以预测 CSR 会发生什么。要了解有关证书签名的更多信息，请参阅[签名请求](https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/)。

内置签署人之一是 `kubernetes.io/legacy-unknown`。CSR 资源的 `v1beta1` API 遵循这个旧版未知的签署人。但是，CSR 的稳定 `v1` API 不允许将 `signerName` 设置为 `kubernetes.io/legacy-unknown`。

如果想使用 Amazon EKS CA 在集群上生成证书，则您必须使用自定义签署人。要使用 CSR `v1` API 版本并生成新证书，必须迁移任何现有清单和 API 客户端。使用现有 `v1beta1` API 创建的现有证书在证书到期之前有效且正常运行。这包括以下这些：
+ 信任分配：无。在 Kubernetes 集群中，此签署人没有标准的信任或分配。
+ 允许的主题：任何
+ 允许的 x509 扩展：遵循 subjectAltName 和密钥使用扩展，并丢弃其他扩展
+ 允许的密钥用法：不得包括 [“密钥加密”、“数字签名”、“服务器身份验证”] 以外的用法
**注意**  
不支持客户端证书签名。
+ 到期/证书使用寿命：1 年（默认值和最大值）
+ 允许/不允许 CA 位：不允许

## 使用 signerName 生成 CSR 示例
<a name="csr-example"></a>

这些步骤介绍如何使用 `signerName: beta.eks.amazonaws.com/app-serving` 为 DNS 名称 `myserver.default.svc` 生成服务证书。将此用作您自己环境的指南。

1. 运行 `openssl genrsa -out myserver.key 2048` 命令以生成 RSA 私有密钥。

   ```
   openssl genrsa -out myserver.key 2048
   ```

1. 运行以下命令以生成证书请求。

   ```
   openssl req -new -key myserver.key -out myserver.csr -subj "/CN=myserver.default.svc"
   ```

1. 为 CSR 请求生成 `base64` 值，并将其存储在变量中，以便在后续步骤中使用。

   ```
   base_64=$(cat myserver.csr | base64 -w 0 | tr -d "
   ")
   ```

1. 要创建名为 `mycsr.yaml` 的文件，请运行以下命令。在以下示例中，`beta.eks.amazonaws.com/app-serving` 是 `signerName`。

   ```
   cat >mycsr.yaml <<EOF
   apiVersion: certificates.k8s.io/v1
   kind: CertificateSigningRequest
   metadata:
     name: myserver
   spec:
     request: $base_64
     signerName: beta.eks.amazonaws.com/app-serving
     usages:
       - digital signature
       - key encipherment
       - server auth
   EOF
   ```

1. 提交 CSR。

   ```
   kubectl apply -f mycsr.yaml
   ```

1. 批准服务证书。

   ```
   kubectl certificate approve myserver
   ```

1. 验证证书是否已颁发。

   ```
   kubectl get csr myserver
   ```

   示例输出如下。

   ```
   NAME       AGE     SIGNERNAME                           REQUESTOR          CONDITION
   myserver   3m20s   beta.eks.amazonaws.com/app-serving   kubernetes-admin   Approved,Issued
   ```

1. 导出已颁发的证书。

   ```
   kubectl get csr myserver -o jsonpath='{.status.certificate}'| base64 -d > myserver.crt
   ```