CertificateSigningRequest 資源
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
Kubernetes 具有內建的 CertificateSigningRequest 資源。此資源與 cert-manager 的 CertificateRequest 類似,它用於從參照的憑證授權單位 (CA) 請求 X.509 簽署憑證。
對於使用支援此資源但不支援 cert-manager CertificateRequest 資源,且仍希望透過 cert-manager 簽署憑證的使用者來說,使用此資源可能很有用。
CertificateSigningRequest 參照一個 SignerName
或簽署者,作為它希望簽署其請求的實體。對於 cert-manager,簽署者可以對應到 Issuer 或 ClusterIssuer。
功能狀態
此功能目前處於實驗性狀態,其行為可能會在後續版本中變更。
⛔️ 此功能僅能透過將其新增至 cert-manager 控制器的 --feature-gates
旗標來啟用
--feature-gates=ExperimentalCertificateSigningRequestControllers=true
可以使用 Helm 來新增
$ helm install \cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--set featureGates="ExperimentalCertificateSigningRequestControllers=true" \--set crds.enabled=true
注意:cert-manager 支援使用所有 內部簽發者簽署 CertificateSigningRequest。
注意:cert-manager *不會*自動核准參照 cert-manager Issuer 的 CertificateSigningRequest。請參閱 Kubernetes 文件,以了解 CertificateSigningRequest 的請求流程。
簽署者名稱
CertificateSigningRequest 包含 spec.signerName
欄位,以參照簽署請求的 CA。cert-manager 的 Issuers 或 ClusterIssuers 以以下形式參照
<resource type>.cert-manager.io/<signer namespace (if namespaced)>.<signer name>
例如,名稱空間 sandbox
中名為 my-issuer
的命名空間 Issuer 會透過以下方式參照
signerName: issuers.cert-manager.io/sandbox.my-issuer
名為 my-cluster-issuer
的 ClusterIssuer 會透過以下方式參照
signerName: clusterissuers.cert-manager.io/my-cluster-issuer
參照命名空間的 Issuer
與 CertificateRequest 不同,CertificateSigningRequest 是叢集範圍的資源。為了防止使用者從他們原本無權存取的命名空間中的命名空間 Issuer 請求憑證,cert-manager 會執行 SubjectAccessReview。此審查可確保請求使用者具有在給定命名空間中 參照
signers
資源的權限。名稱應為 Issuer 的名稱,或是 "*"
以參照該命名空間中的所有 Issuer。
以下範例 Role 會提供在 sandbox
命名空間中參照 Issuer 的權限
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: cert-manager-referencer:my-issuernamespace: sandboxrules:- apiGroups: ["cert-manager.io"]resources: ["signers"]verbs: ["reference"]resourceNames:- "my-issuer" # To give permission to _only_ reference Issuers with the name 'my-issuer'- "*" # To give permission to reference Issuers with any name in this namespace
註解
為了保持與 CertificateRequest 的功能對等,註解用於儲存 CertificateSigningRequest 資源上不存在的 spec
或 status
欄位的值。這些欄位由下方標示的請求者或簽署者設定。
請求者註解
-
experimental.cert-manager.io/request-duration
:由請求者設定。接受 Go 時間持續時間字串,指定請求的憑證持續時間。預設值為 90 天。某些簽署者(例如 Venafi 或 ACME)通常*不允許*請求持續時間。 -
experimental.cert-manager.io/request-is-ca
:由請求者設定。如果設定為"true"
,將會請求 CA 憑證。 -
experimental.cert-manager.io/private-key-secret-name
:由請求者設定。僅適用於 SelfSigned 簽署者。用於參照一個 Secret,其中包含請求者 X.509 憑證簽署請求的 PEM 編碼私密金鑰,金鑰為tls.key
。用於簽署請求者的請求。 -
venafi.experimental.cert-manager.io/custom-fields
:由請求者設定。僅適用於 Venafi 簽署者。用於將自訂欄位新增至 Venafi 請求。這僅適用於 Venafi TPPv19.3
及更高版本。該值為一個 JSON 陣列,其中包含具有名稱和值鍵的物件,例如venafi.experimental.cert-manager.io/custom-fields: |-[{"name": "field-name", "value": "field value"},{"name": "field-name-2", "value": "field value 2"}]
簽署者註解
venafi.experimental.cert-manager.io/pickup-id
:由簽署者設定。僅適用於 Venafi 簽署者。用於記錄已提交至 Venafi API 以便在發行期間收集的憑證簽署請求的 Venafi 提取 ID。
用法
可以使用 cmctl 手動建立 CertificateSigningRequest。此命令會採用包含 憑證資源的資訊清單檔案作為輸入。這會產生私密金鑰並建立 CertificateSigningRequest。CertificateSigningRequest 預設不會核准,因此您可能需要手動核准
$ kubectl certificate approve <name>