第 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.clusterCa 和 Kafka.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,则必须在证书文件中包括整个链。链应该按照以下顺序:
- 集群或客户端 CA
 - 一个或多个中间 CA
 - 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
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 格式中包含证书。
				
流程
替换 Cluster Operator 生成的 CA 证书。
删除现有的 secret。
oc delete secret CA-CERTIFICATE-SECRET
oc delete secret CA-CERTIFICATE-SECRETCopy to Clipboard Copied! Toggle word wrap Toggle overflow ca-CERTIFICATE-SECRET 是
Secret的名称:- 
											集群 CA 证书的 
CLUSTER-NAME-cluster-ca-cert - 
											
CLUSTER-NAME-clients-ca-cert用于客户端 CA 证书 
将 CLUSTER-NAME 替换为 Kafka 集群的名称。
忽略任何 "Not Exists" 错误。
- 
											集群 CA 证书的 
 创建新 secret。
仅在 PEM 格式使用证书创建客户端 secret
oc create secret generic CLUSTER-NAME-clients-ca-cert --from-file=ca.crt=ca.crt
oc create secret generic CLUSTER-NAME-clients-ca-cert --from-file=ca.crt=ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 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
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-PASSWORDCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
替换 Cluster Operator 生成的私钥。
删除现有的 secret。
oc delete secret CA-KEY-SECRET
oc delete secret CA-KEY-SECRETCopy to Clipboard Copied! Toggle word wrap Toggle overflow ca-KEY-SECRET 是 CA 密钥的名称:
- 
											集群 CA 键的 
CLUSTER-NAME-cluster-ca - 
											客户端 CA 密钥的 
CLUSTER-NAME-clients-ca 
- 
											集群 CA 键的 
 创建新 secret。
oc create secret generic CA-KEY-SECRET --from-file=ca.key=ca.key
oc create secret generic CA-KEY-SECRET --from-file=ca.key=ca.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
标记 secret。
oc label secret CA-CERTIFICATE-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=CLUSTER-NAME
oc label secret CA-CERTIFICATE-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=CLUSTER-NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow oc label secret CA-KEY-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=CLUSTER-NAME
oc label secret CA-KEY-SECRET strimzi.io/kind=Kafka strimzi.io/cluster=CLUSTER-NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow - 
									标签 
strimzi.io/kind=Kafka标识 Kafka 自定义资源。 - 
									标签 
strimzi.io/cluster=CLUSTER-NAME标识 Kafka 集群。 
- 
									标签 
 注解 secret
oc annotate secret CA-CERTIFICATE-SECRET strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATION
oc annotate secret CA-CERTIFICATE-SECRET strimzi.io/ca-cert-generation=CA-CERTIFICATE-GENERATIONCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc annotate secret CA-KEY-SECRET strimzi.io/ca-key-generation=CA-KEY-GENERATION
oc annotate secret CA-KEY-SECRET strimzi.io/ca-key-generation=CA-KEY-GENERATIONCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 
									注解 
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 证书。在更新证书时设置更高的增量值。
- 
									注解 
 为集群创建
Kafka资源,配置Kafka.spec.clusterCa或Kafka.spec.clientsCa对象来 不使用 生成的 CA。配置集群 CA 的片段
Kafka资源示例,使用您提供的证书Copy to Clipboard Copied! Toggle word wrap Toggle overflow