

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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 會發生什麼情況。如需憑證簽署的相關資訊，請參閱 [Certificate Signing Requests](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 和金鑰使用方式延伸項目，並放棄其他延伸項目
+ 允許的金鑰使用方式：不得包括 [「金鑰加密」、「數位簽章」、「伺服器身分驗證」] 以外的用法
**注意**  
不支援用戶端憑證簽署。
+ 過期/憑證生命週期：45 天 （預設和上限）
+ 允許/不允許 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
   ```