15.6. 使用您自己的 CA 证书和私钥


安装和使用您自己的 CA 证书和私钥,而不是使用 Cluster Operator 生成的默认值。您可以替换集群和客户端 CA 证书和私钥。

您可以使用以下方法切换到使用您自己的 CA 证书和私钥:

  • 在部署 Kafka 集群前安装您自己的 CA 证书和私钥
  • 在部署 Kafka 集群后,将默认 CA 证书和私钥替换为您自己的默认 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,则必须在证书文件中包含整个链。链应按以下顺序:

      1. 集群或客户端 CA
      2. 一个或多个中间 CA
      3. root CA
    • 链中的所有 CA 都应该使用 X509v3 Basic Constraints 扩展进行配置。基本约束限制证书链的路径长度。
  • 用于转换证书的 OpenSSL TLS 管理工具。

开始前

Cluster Operator 以 PEM (Privacy Enhanced Mail) 和 PKCS #12 (Public-Key Cryptography Standards) 格式生成密钥和证书。您可以以任一格式添加自己的证书。

有些应用程序无法使用 PEM 证书,且只支持 PKCS #12 证书。如果您没有 PKCS #12 格式的集群证书,请使用 OpenSSL TLS 管理工具从 ca.crt 文件中生成一个。

certificate 生成命令示例

openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
Copy to Clipboard Toggle word wrap

<P12_password > 替换为您自己的密码。

流程

  1. 创建包含 CA 证书的新 secret。

    仅使用 PEM 格式的证书创建客户端 secret

    oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crt
    Copy to Clipboard Toggle word wrap

    使用 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
    Copy to Clipboard Toggle word wrap

    <cluster_name > 替换为 Kafka 集群的名称。

  2. 创建一个包含私钥的新 secret。

    oc create secret generic CA-KEY-SECRET --from-file=ca.key=ca.key
    Copy to Clipboard Toggle word wrap
  3. 标记 secret。

    oc label secret CA-CERTIFICATE-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=<cluster_name>
    Copy to Clipboard Toggle word wrap
    oc label secret CA-KEY-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=<cluster_name>
    Copy to Clipboard Toggle word wrap
    • 标签 strimzi.io/kind=Kafka 标识 Kafka 自定义资源。
    • 标签 strimzi.io/cluster= &lt;cluster_name& gt; 标识 Kafka 集群。
  4. 注解 secret

    oc annotate secret CA-CERTIFICATE-SECRET strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATION
    Copy to Clipboard Toggle word wrap
    oc annotate secret CA-KEY-SECRET strimzi.io/ca-key-generation=CA-KEY-GENERATION
    Copy to Clipboard Toggle word wrap
    • 注解 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)开始。在续订证书时设置更高的增量值。

  5. 为集群创建 Kafka 资源,将 Kafka.spec.clusterCaKafka.spec.clientsCa 对象配置为使用生成的 CA。

    配置集群 CA 的片段 Kafka 资源示例,以使用您自己提供的证书

    kind: Kafka
    version: kafka.strimzi.io/v1beta2
    spec:
      # ...
      clusterCa:
        generateCertificateAuthority: false
    Copy to Clipboard Toggle word wrap

15.6.2. 续订您自己的 CA 证书

如果您使用自己的 CA 证书,则需要手动续订。Cluster Operator 不会自动续订。在续订期间内续订 CA 证书,然后再过期。

当您更新 CA 证书并继续同一私钥时,执行此流程中的步骤。如果您要续订您自己的 CA 证书和私钥,请参阅 第 15.6.3 节 “自行续订或替换 CA 证书和私钥”

该流程描述了以 PEM 格式续订 CA 证书。

先决条件

  • Cluster Operator 正在运行。
  • 您有 PEM 格式的新集群或客户端 X.509 证书。

流程

  1. 更新 CA 证书的 Secret

    编辑现有 secret 以添加新的 CA 证书并更新证书生成注解值。

    oc edit secret <ca_certificate_secret_name>
    Copy to Clipboard Toggle word wrap

    <ca_certificate_secret_name > 是 Secret 的名称,即 &lt ;kafka_cluster_name&gt; -cluster-ca-cert 用于集群 CA 证书,& lt;kafka_cluster_name&gt; -clients-ca-cert 用于客户端 CA 证书。

    以下示例显示了与名为 my-cluster 的 Kafka 集群关联的集群 CA 证书的 secret。

    集群 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
    Copy to Clipboard Toggle word wrap

    1
    当前 base64 编码的 CA 证书
    2
    当前 CA 证书生成注解值
  2. 将新 CA 证书编码为 base64。

    cat <path_to_new_certificate> | base64
    Copy to Clipboard Toggle word wrap
  3. 更新 CA 证书。

    将上一步中 base64 编码的 CA 证书复制为 数据 下的 ca.crt 属性的值。

  4. 增加 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 并更新证书。每个 CA 证书续订都必须递增 strimzi.io/ca-cert-generation

  5. 使用新的 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
    Copy to Clipboard Toggle word wrap

    1
    新的 base64 编码的 CA 证书
    2
    新的 CA 证书生成注解值

在下一个协调中,Cluster Operator 对 ZooKeeper、Kafka 和其他组件执行滚动更新来信任新的 CA 证书。

如果配置了维护时间窗,Cluster Operator 会在下一次维护时间窗内第一次协调时滚动 pod。

15.6.3. 自行续订或替换 CA 证书和私钥

如果您使用自己的 CA 证书和私钥,则需要手动续订它们。Cluster Operator 不会自动续订。在续订期间内续订 CA 证书,然后再过期。您还可以使用相同的流程将 AMQ Streams operator 生成的 CA 证书和私钥替换为您自己的 CA 证书和私钥。

当您续订或替换 CA 证书和私钥时,执行此流程中的步骤。如果您只是续订自己的 CA 证书,请参阅 第 15.6.2 节 “续订您自己的 CA 证书”

该流程描述了以 PEM 格式续订 CA 证书和私钥。

在执行以下步骤前,请确保新 CA 证书的 CN (Common Name)与当前 CA 证书不同。例如,当 Cluster Operator 自动更新证书时,它会添加 v<version_number& gt; 后缀来识别版本。通过在每个续订中添加不同的后缀,使用您自己的 CA 证书执行相同的操作。通过使用其他密钥生成新的 CA 证书,您可以保留存储在 Secret 中的当前 CA 证书。

先决条件

  • Cluster Operator 正在运行。
  • 您有 PEM 格式的新集群或客户端 X.509 证书和密钥。

流程

  1. 暂停 Kafka 自定义资源的协调。

    1. 在 OpenShift 中注解自定义资源,将 pause-reconciliation 注解设置为 true

      oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
      Copy to Clipboard Toggle word wrap

      例如,对于名为 my-clusterKafka 自定义资源:

      oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
      Copy to Clipboard Toggle word wrap
    2. 检查自定义资源的状态条件是否显示 ReconciliationPaused 的更改:

      oc describe Kafka <name_of_custom_resource>
      Copy to Clipboard Toggle word wrap

      lastTransitionTimetype 条件会变为 ReconciliationPaused

  2. 检查 Kafka 自定义资源中的 generateCertificateAuthority 属性的设置。

    如果属性设为 false,Cluster Operator 不会生成 CA 证书。如果您使用自己的证书,则需要此设置。

  3. 如果需要,编辑现有 Kafka 自定义资源,并将 generateCertificateAuthority 属性设置为 false

    oc edit Kafka <name_of_custom_resource>
    Copy to Clipboard Toggle word wrap

    以下示例显示了一个 Kafka 自定义资源,其集群和客户端 CA 证书生成委派给用户。

    使用您自己的 CA 证书的 Kafka 配置示例

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    # ...
    spec:
    # ...
      clusterCa:
        generateCertificateAuthority: false 
    1
    
      clientsCa:
        generateCertificateAuthority: false 
    2
    
    # ...
    Copy to Clipboard Toggle word wrap

    1
    使用您自己的集群 CA
    2
    使用您自己的客户端 CA
  4. 更新 CA 证书的 Secret

    1. 编辑现有 secret 以添加新的 CA 证书并更新证书生成注解值。

      oc edit secret <ca_certificate_secret_name>
      Copy to Clipboard Toggle word wrap

      <ca_certificate_secret_name > 是 Secret 的名称,即 KAFKA-CLUSTER-NAME-cluster-ca-cert 用于集群 CA 证书,KAFKA-CLUSTER-NAME-clients-ca-cert 用于客户端 CA 证书。

      以下示例显示了与名为 my-cluster 的 Kafka 集群关联的集群 CA 证书的 secret。

      集群 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
      Copy to Clipboard Toggle word wrap

      1
      当前 base64 编码的 CA 证书
      2
      当前 CA 证书生成注解值
    2. 重命名当前的 CA 证书以保留它。

      将数据 下的当前 ca.crt 属性重命名为 ca- &lt;date& gt; .crt,其中 & lt;date> 是 YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ 格式的证书到期日期。例如 ca-2023-01-26T17-32-00Z.crt:保留 属性的值,因为它是保留当前的 CA 证书。

    3. 将新 CA 证书编码为 base64。

      cat <path_to_new_certificate> | base64
      Copy to Clipboard Toggle word wrap
    4. 更新 CA 证书。

      data 下创建一个新的 ca.crt 属性,并将上一步中的 base64 编码的 CA 证书复制为 ca.crt 属性的值。

    5. 增加 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 并更新证书。每个 CA 证书续订都必须递增 strimzi.io/ca-cert-generation

    6. 使用新的 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
      Copy to Clipboard Toggle word wrap

      1
      新的 base64 编码的 CA 证书
      2
      旧的 base64 编码的 CA 证书
      3
      新的 CA 证书生成注解值
  5. 更新用于为新 CA 证书签名的 CA 密钥的 Secret

    1. 编辑现有的 secret,以添加新的 CA 密钥并更新密钥生成注解值。

      oc edit secret <ca_key_name>
      Copy to Clipboard Toggle word wrap

      <ca_key_name > 是 CA 密钥的名称,即 &lt ;kafka_cluster_name&gt; -cluster-ca 用于集群 CA 密钥,& lt;kafka_cluster_name&gt; -clients-ca 用于客户端 CA 密钥。

      以下示例显示了与名为 my-cluster 的 Kafka 集群关联的集群 CA 密钥的 secret。

      集群 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
      Copy to Clipboard Toggle word wrap

      1
      当前 base64 编码的 CA 密钥
      2
      当前 CA 密钥生成注解值
    2. 将 CA 密钥编码为 base64。

      cat <path_to_new_key> | base64
      Copy to Clipboard Toggle word wrap
    3. 更新 CA 密钥。

      将上一步中 base64 编码的 CA 密钥复制为 data 下的 ca.key 属性的值。

    4. 增加 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 并更新证书和密钥。每个 CA 证书续订都必须递增 strimzi.io/ca-key-generation

  6. 使用新的 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
    Copy to Clipboard Toggle word wrap

    1
    新的 base64 编码的 CA 密钥
    2
    新的 CA 密钥生成注解值
  7. 从暂停恢复。

    要恢复 Kafka 自定义资源协调,请将 pause-reconciliation 注解设置为 false

    oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"
    Copy to Clipboard Toggle word wrap

    您还可以通过删除 pause-reconciliation 注解来执行相同的操作。

    oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-
    Copy to Clipboard Toggle word wrap

    在下一个协调中,Cluster Operator 对 ZooKeeper、Kafka 和其他组件执行滚动更新来信任新的 CA 证书。滚动更新完成后,Cluster Operator 将启动一个新服务器证书,以生成由新 CA 密钥签名的新服务器证书。

    如果配置了维护时间窗,Cluster Operator 会在下一次维护时间窗内第一次协调时滚动 pod。

  8. 等待滚动更新移至新的 CA 证书。
  9. 从 secret 配置中删除任何过时的证书,以确保集群不再信任它们。

    oc edit secret <ca_certificate_secret_name>
    Copy to Clipboard Toggle word wrap

    删除旧证书的 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
    Copy to Clipboard Toggle word wrap

  10. 启动集群的手动滚动更新,以获取对 secret 配置所做的更改。

    请参阅 第 27.9 节 “使用注解启动 Kafka 和其他操作对象的滚动更新”

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat