第 10 章 管理 TLS 证书


AMQ Streams 支持 TLS 用于 Kafka 和 AMQ Streams 组件之间的加密通信。

通信始终在以下组件间加密:

  • Kafka 和 ZooKeeper 之间的通信
  • Kafka 代理间的 Interbroker 通信
  • ZooKeeper 节点间的交互通信
  • AMQ Streams operator 通信 Kafka 代理和 ZooKeeper 节点

Kafka 客户端和 Kafka 代理之间的通信会根据集群的配置加密。对于 Kafka 和 AMQ Streams 组件,TLS 证书也用于身份验证。

Cluster Operator 会自动设置并更新 TLS 证书,以便在集群中启用加密和身份验证。如果您想在 Kafka 代理和客户端之间启用加密或 TLS 身份验证,它还设置其他 TLS 证书。

证书颁发机构(CA)证书由 Cluster Operator 生成,以验证组件和客户端的身份。如果您不想使用 Cluster Operator 生成的 CA,您可以安装自己的集群和客户端 CA 证书

您还可以为启用了 TLS 加密的 TLS 监听器或外部监听程序 提供 Kafka 侦听器证书。使用 Kafka 侦听器证书包含您已掌握的安全基础架构。

注意

您提供的任何证书都不会由 Cluster Operator 更新。

图 10.1. TLS 保护的通信架构示例

安全通信

10.1. 证书授权

要支持加密,每个 AMQ Streams 组件需要自己的私钥和公钥证书。所有组件证书都由称为 集群 CA 的内部证书颁发机构(CA)签名。

同样,使用 TLS 客户端身份验证连接到 AMQ Streams 的每个 Kafka 客户端应用程序都需要提供私钥和证书。第二个内部 CA 用于指定 客户端 CA,用于为 Kafka 客户端签署证书。

10.1.1. CA 证书

集群 CA 和客户端 CA 都有一个自签名的公钥证书。

Kafka 代理配置为信任由集群 CA 或客户端 CA 签名的证书。客户端不需要连接的组件,如 ZooKeeper,只有由集群 CA 签名的信任证书。除非禁用外部监听器的 TLS 加密,客户端应用程序必须信任由集群 CA 签名的证书。对于执行 相互 TLS 身份验证的客户端应用程序,这也适用

默认情况下,AMQ Streams 会自动生成并续订由集群 CA 或客户端 CA 发布的 CA 证书。您可以在 Kafka.spec.clusterCaKafka.spec.clientsCa 对象中配置这些 CA 证书的管理。用户提供的证书不会被更新。

您可以为集群 CA 或客户端 CA 提供自己的 CA 证书。更多信息请参阅 第 10.1.2 节 “安装您自己的 CA 证书”。如果您提供自己的证书,则必须在需要时手动续订。

10.1.2. 安装您自己的 CA 证书

这个步骤描述了如何安装自己的 CA 证书和密钥,而不是使用 Cluster Operator 生成的 CA 证书和私钥。

Cluster Operator 会自动生成和更新以下 secret:

CLUSTER-NAME-cluster-ca
包含集群 CA 私钥的集群 secret。
CLUSTER-NAME-cluster-ca-cert
包含集群 CA 证书的集群 secret。证书包含验证 Kafka 代理身份的公钥。
CLUSTER-NAME-clients-ca
包含客户端 CA 私钥的客户端 secret。
CLUSTER-NAME-clients-ca-cert
包含客户端 CA 证书的客户端 secret。证书包含一个公钥,用于验证客户端访问 Kafka 代理的客户端身份。

AMQ Streams 默认使用这些 secret。

此流程描述了替换 secret 使用您自己的集群或客户端 CA 证书的步骤。

先决条件

  • Cluster Operator 正在运行。
  • Kafka 集群尚未部署。
  • 您自己的 X.509 证书和密钥,采用 PEM 格式集群 CA 或客户端 CA。

    • 如果要使用不是 Root CA 的集群或客户端 CA,则必须在证书文件中包括整个链。链应该按照以下顺序:

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

开始前

Cluster Operator 为 CLUSTER-NAME-cluster-ca-cert secret 生成以下文件:

  • 使用 PEM 格式的 CA.crt 集群证书
  • PKCS #12 格式的 CA .p12 集群证书
  • ca.password 以访问 PKCS #12 文件

有些应用程序无法使用 PEM 证书并支持 PKCS #12 证书。您还可以使用 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 替换为您自己的密码。

您可以为 CLUSTER-NAME-clients-ca-cert secret 执行相同的操作,它还会默认在 PEM 和 PKCS #12 格式中包含证书。

流程

  1. 替换 Cluster Operator 生成的 CA 证书。

    1. 删除现有的 secret。

      oc delete secret CA-CERTIFICATE-SECRET

      ca-CERTIFICATE-SECRETSecret 的名称:

      • 集群 CA 证书的 CLUSTER-NAME-cluster-ca-cert
      • CLUSTER-NAME-clients-ca-cert 用于客户端 CA 证书

      CLUSTER-NAME 替换为 Kafka 集群的名称。

      忽略任何 "Not Exists" 错误。

    2. 创建新 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

  2. 替换 Cluster Operator 生成的私钥。

    1. 删除现有的 secret。

      oc delete secret CA-KEY-SECRET

      ca-KEY-SECRET 是 CA 密钥的名称:

      • 集群 CA 键的 CLUSTER-NAME-cluster-ca
      • 客户端 CA 密钥的 CLUSTER-NAME-clients-ca
    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
    • 标签 strimzi.io/kind=Kafka 标识 Kafka 自定义资源。
    • 标签 strimzi.io/cluster=CLUSTER-NAME 标识 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 密钥的生成。

      如果您要自动替换 Cluster Operator 生成的 CA 证书,请使用现有注解中的下一个增量值,并遵循 替换 CA 密钥流程。如果没有 Cluster Operator 会自动生成的 CA 证书,请从 0 (零)开始作为增量值(strimzi.io/ca-cert-generation=0)作为您自己的 CA 证书。在更新证书时设置更高的增量值。

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

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

    kind: Kafka
    version: kafka.strimzi.io/v1beta2
    spec:
      # ...
      clusterCa:
        generateCertificateAuthority: false

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.