10.3. 证书续订有效期


集群 CA 和客户端 CA 证书仅在有限的时间段内有效,称为有效期。这通常定义为自生成证书起的天数。

对于 Cluster Operator 自动创建的 CA 证书,您可以配置以下有效期:

  • Cluster CA certificates in Kafka.spec.clusterCa.validityDays
  • Kafka.spec.clientsCa.validityDays中的客户端 CA 证书

两个证书的默认有效期周期为 365 天。手动安装的 CA 证书应该定义了自己的有效期。

当 CA 证书过期时,仍信任该证书的组件和客户端不接受来自由 CA 私钥签名的证书的对等的 TLS 连接。组件和客户端需要信任 新的 CA 证书。

要允许在缺少服务的情况下续订 CA 证书,Cluster Operator 会在旧 CA 证书过期前启动证书续订。

您可以配置 Cluster Operator 创建的证书的续订周期:

  • Kafka.spec.clusterCa.renewalDays中的集群 CA 证书
  • Kafka.spec.clientsCa.renewalDays中的客户端 CA 证书

两个证书的默认续订周期为 30 天。

从当前证书的过期日期后,后来测量续订周期。

针对续订的有效期

Not Before                                     Not After
    |                                              |
    |<--------------- validityDays --------------->|
                              <--- renewalDays --->|
Copy to Clipboard Toggle word wrap

要在创建 Kafka 集群后更改有效期和续订周期,请配置并应用 Kafka 自定义资源,并 手动更新 CA 证书。如果您不手动续订证书,下一次证书被自动续订时将使用新的周期。

证书有效期和续订周期的 Kafka 配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
  clusterCa:
    renewalDays: 30
    validityDays: 365
    generateCertificateAuthority: true
  clientsCa:
    renewalDays: 30
    validityDays: 365
    generateCertificateAuthority: true
# ...
Copy to Clipboard Toggle word wrap

在续订期间,Cluster Operator 的行为取决于证书生成属性的设置,generateCertificateAuthoritygenerateCertificateAuthority

true
如果属性被设置为 true,Cluster Operator 会自动生成 CA 证书,并在续订周期内自动续订。
false
如果属性设置为 false,Cluster Operator 不会生成 CA 证书。如果您要 安装自己的证书,则使用此选项。

10.3.1. 使用自动生成的 CA 证书的续订过程

Cluster Operator 执行以下操作以续订 CA 证书:

  1. 生成新的 CA 证书,但保留现有的密钥。新证书将旧证书替换为对应 Secret 中的名称 ca.crt
  2. 生成新客户端证书(用于 ZooKeeper 节点、Kafka 代理和实体 Operator)。这并非绝对必要,因为签名密钥没有更改,但它会使客户端证书的有效性期与 CA 证书保持同步。
  3. 重启 ZooKeeper 节点,以便他们信任新的 CA 证书并使用新的客户端证书。
  4. 重启 Kafka 代理,以便它们信任新的 CA 证书并使用新的客户端证书。
  5. 重启主题和用户 Operator,以便他们信任新的 CA 证书并使用新的客户端证书。

10.3.2. 客户端证书续订

Cluster Operator 不知道使用 Kafka 集群的客户端应用程序。

当连接到集群时,并确保它们正常工作,客户端应用程序必须:

  • 信任 <cluster> - cluster-ca-cert Secret 中发布的集群 CA 证书。
  • 使用 < user-name> Secret 中发布的凭证来连接集群。

    User Secret 以 PEM 和 PKCS #12 格式提供凭证,或使用 SCRAM-SHA 身份验证时提供密码。User Operator 在创建用户时创建用户凭证。

您必须确保客户端在证书续订后继续工作。续订过程取决于如何配置客户端。

如果要手动置备客户端证书和密钥,您必须生成新的客户端证书,并确保客户端在续订期间使用新证书。续订周期结束时未能执行此操作,可能会导致客户端应用程序无法连接到集群。

注意

对于在同一 OpenShift 集群和命名空间中运行的工作负载,机密可以挂载为卷,以便客户端 Pod 从 Secret 的当前状态构建其密钥存储和信任存储。有关此步骤的详情,请参阅配置内部客户端以信任集群 CA

10.3.3. 手动更新 Cluster Operator 生成的 CA 证书

Cluster Operator 生成的集群和客户端 CA 证书会在对应的证书续订期间开始自动续订。但是,您可以在证书续订周期开始前,使用 strimzi.io/force-renew 注解手动续订这些证书。出于安全考虑,或者您已 更改了证书的续订或有效期期,您可能会这样做。

续订的证书使用与旧证书相同的私钥。

注意

如果您使用自己的 CA 证书,则无法使用 force-renew 注解。相反,请按照流程 更新您自己的 CA 证书

先决条件

  • Cluster Operator 正在运行。
  • 安装 CA 证书和私钥的 Kafka 集群。

流程

  1. strimzi.io/force-renew 注解应用到包含您要续订的 CA 证书的 Secret

    Expand
    表 10.13. 强制续订证书的 Secret 注解
    证书Secretannotate 命令

    集群 CA

    KAFKA-CLUSTER-NAME-cluster-ca-cert

    oc annotate secret KAFKA-CLUSTER-NAME-cluster-ca-cert strimzi.io/force-renew=true

    客户端 CA

    KAFKA-CLUSTER-NAME-clients-ca-cert

    oc annotate secret KAFKA-CLUSTER-NAME-clients-ca-cert strimzi.io/force-renew=true

    在下一次协调时,Cluster Operator 会为您注解的 Secret 生成新的 CA 证书。如果配置了维护时间窗口,Cluster Operator 会在下一次维护时间窗口首次协调时生成新的 CA 证书。

    客户端应用程序必须重新载入 Cluster Operator 续订的集群和客户端 CA 证书。

  2. 检查 CA 证书的期间:

    例如,使用 openssl 命令:

    oc get secret CA-CERTIFICATE-SECRET -o 'jsonpath={.data.CA-CERTIFICATE}' | base64 -d | openssl x509 -subject -issuer -startdate -enddate -noout
    Copy to Clipboard Toggle word wrap

    CA-CERTIFICATE-SECRETSecret 的名称,即 KAFKA-CLUSTER-NAME-cluster-ca-cert,用于集群 CA 证书和 KAFKA-CLUSTER-NAME-clients-ca-cert

    CA-CERTIFICATE 是 CA 证书的名称,如 jsonpath={.data.ca\.crt}

    该命令返回一个 notBeforenotAfter 日期,这是 CA 证书的有效性周期。

    例如,对于集群 CA 证书:

    subject=O = io.strimzi, CN = cluster-ca v0
    issuer=O = io.strimzi, CN = cluster-ca v0
    notBefore=Jun 30 09:43:54 2020 GMT
    notAfter=Jun 30 09:43:54 2021 GMT
    Copy to Clipboard Toggle word wrap
  3. 从 Secret 中删除旧证书。

    当组件使用新证书时,旧的证书可能仍在激活。删除旧的证书以移除任何潜在的安全风险。

您可以替换由 Cluster Operator 生成的集群 CA 和客户端 CA 证书使用的私钥。当替换私钥时,Cluster Operator 会为新私钥生成新的 CA 证书。

注意

如果您使用自己的 CA 证书,则无法使用 force-replace 注解。相反,请按照流程 更新您自己的 CA 证书

先决条件

  • Cluster Operator 正在运行。
  • 安装 CA 证书和私钥的 Kafka 集群。

流程

  • strimzi.io/force-replace 注解应用到包含您要续订的私钥的 Secret

    Expand
    表 10.14. 替换私钥的命令
    私钥:Secretannotate 命令

    集群 CA

    CLUSTER-NAME-cluster-ca

    oc annotate secret CLUSTER-NAME-cluster-ca strimzi.io/force-replace=true

    客户端 CA

    CLUSTER-NAME-clients-ca

    oc annotate secret CLUSTER-NAME-clients-ca strimzi.io/force-replace=true

在下一次协调 Cluster Operator 时:

  • 为您注解的 Secret 生成新私钥
  • 生成一个新的 CA 证书

如果配置了维护时间窗口,Cluster Operator 会在下一次维护时间窗口第一次协调时生成新的私钥和 CA 证书。

客户端应用程序必须重新载入 Cluster Operator 续订的集群和客户端 CA 证书。

10.3.5. 更新您自己的 CA 证书

此流程描述了如何更新您使用的 CA 证书而不是 Cluster Operator 生成的证书。

如果您没有更改对应的 CA 密钥,请执行以下步骤。否则,执行 替换您自己的 CA 证书所使用的私钥 的步骤。

如果您使用自己的证书,Cluster Operator 不会自动续订。因此,务必要在证书续订期间遵循这个步骤,以替换很快过期的 CA 证书。

该流程描述了 PEM 格式更新 CA 证书。

先决条件

流程

  1. 更新 CA 证书的 Secret

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

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

    <ca_certificate_secret_name > 是 Secret 的名称,这是集群 CA 证书的 < kafka_cluster_name> -cluster-ca-cert,以及客户端 CA 证书的 < kafka_cluster_name> -clients-ca-cert

    以下示例显示了与名为 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 证书复制为 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
    Copy to Clipboard Toggle word wrap

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

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

如果配置了维护时间窗口,Cluster Operator 会在下一次维护时间窗口中第一次协调时部署 pod。

10.3.6. 替换您自己的 CA 证书使用的私钥

此流程描述了如何更新您使用的 CA 证书和私钥,而不是由 Cluster Operator 生成的证书和密钥。

当您还要更改对应的 CA 密钥时,执行此步骤中的步骤。否则,请执行以下步骤以 续订您自己的 CA 证书

如果您使用自己的证书,Cluster Operator 不会自动续订。因此,务必要在证书续订期间遵循这个步骤,以替换很快过期的 CA 证书。

该流程描述了 PEM 格式更新 CA 证书。

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

先决条件

流程

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

    1. 在 OpenShift 中注解自定义资源,将 pause-recon ation 注解设置为 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. 检查自定义资源的状态条件是否显示 Reconliation Paused 的更改:

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

      类型 条件会改变在 lastTransitionTime 中用于 ReconliationPaused

  2. 更新 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

      以下示例显示了与名为 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 证书以保留它。

      data 下的 ca.crt 属性重命名为 ca- <date&gt; .crt,其中 & lt;date > 是证书过期日期,格式为 YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ。例如,ca-2022-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 并更新证书。strimzi.io/ca-cert-generation 必须在每次 CA 证书续订时递增。

    6. 使用新的 CA 证书和证书生成注解值保存 secret。

      使用新 CA 证书更新的 secret 配置示例

      apiVersion: v1
      kind: Secret
      data:
        ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... 
      1
      
        ca-2022-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 证书生成注解值
  3. 更新用于为新 CA 证书签名的 CA 密钥的 Secret

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

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

      <ca_key_name > 是 CA 键的名称,它是集群 CA 键的 < kafka_cluster_name> -cluster-ca,客户端 CA 键的 < kafka_cluster_name> -clients-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 并更新证书和密钥。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
    Copy to Clipboard Toggle word wrap

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

    要恢复 Kafka 自定义资源协调,请将 pause-reconation 注解设置为 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。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat