15.6. 使用您自己的 CA 证书和私钥
安装和使用您自己的 CA 证书和私钥,而不使用 Cluster Operator 生成的默认值。您可以替换集群和客户端 CA 证书和私钥。
您可以使用以下方法切换到使用自己的 CA 证书和私钥:
- 在部署 Kafka 集群前安装自己的 CA 证书和私钥
- 在部署 Kafka 集群后,将默认 CA 证书和私钥替换为您自己的
在部署 Kafka 集群后替换默认 CA 证书和私钥的步骤与用来更新您自己的 CA 证书和私钥的步骤相同。
如果您使用自己的证书,则不会自动更新它们。您需要在过期前续订 CA 证书和私钥。
续订选项:
- 仅续订 CA 证书
- 续订 CA 证书和私钥(或替换默认值)
15.6.1. 安装您自己的 CA 证书和私钥
安装您自己的 CA 证书和私钥,而不使用 Cluster Operator 生成的集群和客户端 CA 证书和私钥。
默认情况下,AMQ Streams 使用以下 集群 CA 和客户端 CA secret,这些 secret 会自动续订。
集群 CA secret
-
<cluster_name>-cluster-ca
-
<cluster_name>-cluster-ca-cert
-
客户端 CA secret
-
<cluster_name>-clients-ca
-
<cluster_name>-clients-ca-cert
-
要安装自己的证书,请使用相同的名称。
先决条件
- Cluster Operator 正在运行。
Kafka 集群尚未部署。
如果您已经部署了 Kafka 集群,您可以将 默认 CA 证书替换为您自己的。
集群 CA 或客户端 CA 的 PEM 格式的您自己的 X.509 证书和密钥。
如果要使用不是 Root CA 的集群或客户端 CA,则必须在证书文件中包含整个链。链应该按以下顺序排列:
- 集群或客户端 CA
- 一个或多个中间 CA
- root CA
- 链中的所有 CA 都应该使用 X509v3 基本约束扩展进行配置。基本限制限制证书链的路径长度。
- 用于转换证书的 OpenSSL TLS 管理工具。
开始前
Cluster Operator 以 PEM (Privacy Enhanced Mail) 和 PKCS #12 (Public-Key Cryptography Standards) 格式生成密钥和证书。您可以使用任一格式添加自己的证书。
有些应用程序无法使用 PEM 证书,且只支持 PKCS #12 证书。如果您没有 PKCS #12 格式的集群证书,请使用 OpenSSL TLS 管理工具从 ca.crt
文件中生成一个。
证书生成命令示例
openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
将 <P12_password > 替换为您自己的密码。
流程
创建一个包含 CA 证书的新 secret。
仅使用 PEM 格式的证书创建客户端 secret
oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crt
使用 PEM 和 PKCS #12 格式的证书创建集群 secret
oc create secret generic <cluster_name>-cluster-ca-cert \ --from-file=ca.crt=ca.crt \ --from-file=ca.p12=ca.p12 \ --from-literal=ca.password=P12-PASSWORD
将 <cluster_name > 替换为 Kafka 集群的名称。
创建一个包含私钥的新 secret。
oc create secret generic CA-KEY-SECRET --from-file=ca.key=ca.key
标记 secret。
oc label secret CA-CERTIFICATE-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=<cluster_name>
oc label secret CA-KEY-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=<cluster_name>
-
Label
strimzi.io/kind=Kafka
标识 Kafka 自定义资源。 -
标签
strimzi.io/cluster= <cluster_name&
gt; 标识 Kafka 集群。
-
Label
注解 secret
oc annotate secret CA-CERTIFICATE-SECRET strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATION
oc annotate secret CA-KEY-SECRET strimzi.io/ca-key-generation=CA-KEY-GENERATION
-
注解
strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATION
定义新 CA 证书的生成。 注解
strimzi.io/ca-key-generation=CA-KEY-GENERATION
定义新 CA 密钥的生成。从 0 (零)作为您自己的 CA 证书的增量值(
strimzi.io/ca-cert-generation=0
)开始。在续订证书时设置更高的增量值。
-
注解
为集群创建
Kafka
资源,将Kafka.spec.clusterCa
或Kafka.spec.clientsCa
对象配置为不使用生成的 CA。将集群 CA 配置为使用您自己提供的证书片段
Kafka
资源示例kind: Kafka version: kafka.strimzi.io/v1beta2 spec: # ... clusterCa: generateCertificateAuthority: false
15.6.2. 续订您自己的 CA 证书
如果您使用自己的 CA 证书,则需要手动续订它们。Cluster Operator 不会自动更新它们。在续订周期到期前续订 CA 证书。
当您续订 CA 证书并使用相同的私钥时,请执行以下步骤中的步骤。如果您要更新自己的 CA 证书和私钥,请参阅 第 15.6.3 节 “自行续订或替换 CA 证书和私钥”。
该流程描述了以 PEM 格式续订 CA 证书。
先决条件
- Cluster Operator 正在运行。
- 您有 PEM 格式的新集群或客户端 X.509 证书。
流程
更新 CA 证书的
Secret
。编辑现有 secret 以添加新 CA 证书并更新证书生成注解值。
oc edit secret <ca_certificate_secret_name>
<ca_certificate_secret_name > 是
Secret
的名称,即 <kafka_cluster_name> -cluster-ca-cert
用于集群 CA 证书,<kafka_cluster_name> -clients-ca-cert
用于客户端 CA 证书。以下示例显示了与集群 CA 证书的 secret,它与名为
my-cluster
的 Kafka 集群相关联。集群 CA 证书的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 1 metadata: annotations: strimzi.io/ca-cert-generation: "0" 2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
将新 CA 证书编码为 base64。
cat <path_to_new_certificate> | base64
更新 CA 证书。
复制上一步中的 base64 编码的 CA 证书,作为
data
下的ca.crt
属性的值。增加 CA 证书生成注解的值。
使用更高的增量值更新
strimzi.io/ca-cert-generation
注解。例如,将strimzi.io/ca-cert-generation=0
更改为strimzi.io/ca-cert-generation=1
。如果Secret
缺少注解,则该值被视为0,
因此添加值为1
的注解。当 AMQ Streams 生成证书时,Cluster Operator 会自动递增证书生成注解。对于您自己的 CA 证书,请使用更高的增量值设置注解。该注解需要的值高于当前 secret 中的值,以便 Cluster Operator 可以滚动 pod 并更新证书。
strimzi.io/ca-cert-generation
必须针对每个 CA 证书续订递增。使用新的 CA 证书和密钥生成注解值保存 secret。
使用新 CA 证书更新的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... 1 metadata: annotations: strimzi.io/ca-cert-generation: "1" 2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
在下一个协调中,Cluster Operator 对 ZooKeeper、Kafka 和其他组件执行滚动更新,以信任新的 CA 证书。
如果配置了维护时间窗,Cluster Operator 将在下次维护时间窗内第一次协调 pod。
15.6.3. 自行续订或替换 CA 证书和私钥
如果您使用自己的 CA 证书和私钥,则需要手动续订它们。Cluster Operator 不会自动更新它们。在续订周期到期前续订 CA 证书。您还可以使用相同的步骤将 AMQ Streams Operator 生成的 CA 证书和私钥替换为您自己的。
在续订或替换 CA 证书和私钥时,请执行以下步骤中的步骤。如果您只更新自己的 CA 证书,请参阅 第 15.6.2 节 “续订您自己的 CA 证书”。
该流程描述了以 PEM 格式续订 CA 证书和私钥。
在执行以下步骤前,请确保新 CA 证书的 CN (Common Name)与当前 CA 证书不同。例如,当 Cluster Operator 续订证书时自动添加 v<version_number> 后缀来标识版本时。通过在每个续订中添加不同的后缀,对您自己的 CA 证书执行同样的操作。通过使用其他密钥生成新 CA 证书,您可以保留存储在 Secret
中的当前 CA 证书。
先决条件
- Cluster Operator 正在运行。
- 您有 PEM 格式的新集群或客户端 X.509 证书和密钥。
流程
暂停
Kafka
自定义资源的协调。在 OpenShift 中注解自定义资源,将
pause-reconciliation
注解设置为true
:oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
例如,对于名为
my-cluster
的Kafka
自定义资源:oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
检查自定义资源的状态条件是否显示
ReconciliationPaused
的更改:oc describe Kafka <name_of_custom_resource>
在
lastTransitionTime
中type
条件会变为ReconciliationPaused
。
更新 CA 证书的
Secret
。编辑现有 secret 以添加新 CA 证书并更新证书生成注解值。
oc edit secret <ca_certificate_secret_name>
<ca_certificate_secret_name > 是
Secret
的名称,即KAFKA-CLUSTER-NAME-cluster-ca-cert
用于集群 CA 证书,KAFKA-CLUSTER-NAME-clients-ca-cert
用于客户端 CA 证书。以下示例显示了与集群 CA 证书的 secret,它与名为
my-cluster
的 Kafka 集群相关联。集群 CA 证书的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 1 metadata: annotations: strimzi.io/ca-cert-generation: "0" 2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
重命名当前的 CA 证书以保留它。
将数据
下的当前ca.crt
属性重命名为ca- <date& gt; .crt
,其中 & lt;date> 是 YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ 格式的证书过期日期。例如ca-2023-01-26T17-32-00Z.crt:
保留属性的值,因为它保留当前的 CA 证书。将新 CA 证书编码为 base64。
cat <path_to_new_certificate> | base64
更新 CA 证书。
在
data
下创建一个新的ca.crt
属性,并将上一步中的 base64 编码的 CA 证书复制为ca.crt
属性的值。增加 CA 证书生成注解的值。
使用更高的增量值更新
strimzi.io/ca-cert-generation
注解。例如,将strimzi.io/ca-cert-generation=0
更改为strimzi.io/ca-cert-generation=1
。如果Secret
缺少注解,则该值被视为0,
因此添加值为1
的注解。当 AMQ Streams 生成证书时,Cluster Operator 会自动递增证书生成注解。对于您自己的 CA 证书,请使用更高的增量值设置注解。该注解需要的值高于当前 secret 中的值,以便 Cluster Operator 可以滚动 pod 并更新证书。
strimzi.io/ca-cert-generation
必须针对每个 CA 证书续订递增。使用新的 CA 证书和密钥生成注解值保存 secret。
使用新 CA 证书更新的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... 1 ca-2023-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... 2 metadata: annotations: strimzi.io/ca-cert-generation: "1" 3 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
更新用于为您的新 CA 证书签名的 CA 密钥的
Secret
。编辑现有 secret 以添加新的 CA 密钥并更新密钥生成注解值。
oc edit secret <ca_key_name>
<ca_key_name > 是 CA 密钥的名称,即 <
;kafka_cluster_name> -cluster-ca
用于集群 CA 密钥,<kafka_cluster_name> -clients-ca
用于客户端 CA 密钥。以下示例显示了与集群 CA 密钥的 secret,它与名为
my-cluster
的 Kafka 集群相关联。集群 CA 密钥的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.key: SA1cKF1GFDzOIiPOIUQBHDNFGDFS... 1 metadata: annotations: strimzi.io/ca-key-generation: "0" 2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
将 CA 密钥编码为 base64。
cat <path_to_new_key> | base64
更新 CA 密钥。
复制上一步中的 base64 编码的 CA 密钥,作为
data
下的ca.key
属性的值。增加 CA 密钥生成注解的值。
使用更高的增量值更新
strimzi.io/ca-key-generation
注解。例如,将strimzi.io/ca-key-generation=0
更改为strimzi.io/ca-key-generation=1
。如果Secret
缺少注解,它将被视为0,
因此添加值为1
的注解。当 AMQ Streams 生成证书时,Cluster Operator 会自动递增密钥生成注解。对于您自己的 CA 证书以及新的 CA 密钥,请使用更高的增量值设置注解。该注解需要的值高于当前 secret 中的值,以便 Cluster Operator 可以滚动 pod 并更新证书和密钥。
strimzi.io/ca-key-generation
必须针对每个 CA 证书续订递增。
使用新的 CA 密钥和密钥生成注解值保存 secret。
使用新 CA 密钥更新的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.key: AB0cKF1GFDzOIiPOIUQWERZJQ0F... 1 metadata: annotations: strimzi.io/ca-key-generation: "1" 2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
从暂停中恢复。
要恢复
Kafka
自定义资源协调,请将pause-reconciliation
注解设置为false
。oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"
您还可以删除
pause-reconciliation
注解来达到同样的操作。oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-
在下一个协调中,Cluster Operator 对 ZooKeeper、Kafka 和其他组件执行滚动更新,以信任新的 CA 证书。滚动更新完成后,Cluster Operator 将启动一个新的服务器证书来生成由新 CA 密钥签名的新的服务器证书。
如果配置了维护时间窗,Cluster Operator 将在下次维护时间窗内第一次协调 pod。
- 等待滚动更新移至新的 CA 证书。
从 secret 配置中删除任何过时的证书,以确保集群不再信任它们。
oc edit secret <ca_certificate_secret_name>
删除旧证书的 secret 配置示例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
启动集群的手动滚动更新,以获取对 secret 配置所做的更改。