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,则必须在证书文件中包含整个链。链应该按以下顺序排列:

      1. 集群或客户端 CA
      2. 一个或多个中间 CA
      3. 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 > 替换为您自己的密码。

流程

  1. 创建一个包含 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 集群的名称。

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

    oc create secret generic CA-KEY-SECRET --from-file=ca.key=ca.key
  3. 标记 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= &lt;cluster_name& gt; 标识 Kafka 集群。
  4. 注解 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)开始。在续订证书时设置更高的增量值。

  5. 为集群创建 Kafka 资源,将 Kafka.spec.clusterCaKafka.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 证书。

流程

  1. 更新 CA 证书的 Secret

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

    oc edit secret <ca_certificate_secret_name>

    <ca_certificate_secret_name > 是 Secret 的名称,即 &lt ;kafka_cluster_name&gt; -cluster-ca-cert 用于集群 CA 证书,& lt;kafka_cluster_name&gt; -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

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

    cat <path_to_new_certificate> | base64
  3. 更新 CA 证书。

    复制上一步中的 base64 编码的 CA 证书,作为 data 下的 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 并更新证书。strimzi.io/ca-cert-generation 必须针对每个 CA 证书续订递增。

  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

    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 证书,请参阅 第 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"

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

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

      oc describe Kafka <name_of_custom_resource>

      lastTransitionTimetype 条件会变为 ReconciliationPaused

  2. 更新 CA 证书的 Secret

    1. 编辑现有 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

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

    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

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

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

      oc edit secret <ca_key_name>

      <ca_key_name > 是 CA 密钥的名称,即 &lt ;kafka_cluster_name&gt; -cluster-ca 用于集群 CA 密钥,& lt;kafka_cluster_name&gt; -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

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

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

  4. 使用新的 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

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

    要恢复 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。

  6. 等待滚动更新移至新的 CA 证书。
  7. 从 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

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

    请参阅 第 27.9 节 “使用注解启动 Kafka 和 ZooKeeper 集群的滚动更新”

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.