Apache Pulsar 中使用 KeyStore 配置 TLS 安全通信指南
前言
在现代分布式系统中,数据传输安全是至关重要的。Apache Pulsar 作为一款高性能的分布式消息系统,提供了完善的 TLS 支持来保障通信安全。本文将深入讲解如何在 Pulsar 中使用 Java KeyStore 格式配置 TLS 加密和认证。
TLS 基础概念
什么是 TLS
TLS(Transport Layer Security)是一种加密协议,用于在网络通信中提供隐私和数据完整性。它建立在 SSL 协议之上,是当前互联网安全通信的标准。
KeyStore 与 TrustStore 的区别
- KeyStore:存储服务端的私钥和证书,用于证明自身身份
- TrustStore:存储客户端信任的 CA 证书,用于验证服务端身份
在 Pulsar 中,KeyStore 通常采用 JKS 格式(Java KeyStore),这是 Java 平台的标准密钥库格式。
生成 TLS 证书
创建 Broker 密钥对
首先需要为每个 Broker 节点生成密钥对和证书:
keytool -keystore broker.keystore.jks -alias localhost -validity 365 -genkeypair -keyalg RSA
关键参数说明:
-validity 365
:证书有效期为 1 年-keyalg RSA
:使用 RSA 加密算法-alias localhost
:证书别名,建议使用服务器域名
重要提示:证书的 CN(Common Name)必须与服务器完全限定域名(FQDN)完全匹配,否则会导致 TLS 验证失败。
创建私有 CA
为了确保证书的可信度,我们需要创建私有证书颁发机构(CA):
openssl req -new -x509 -keyout ca-key -out ca-cert -days 365
此命令会生成 CA 的私钥(ca-key)和证书(ca-cert)。
配置客户端 TrustStore
将 CA 证书导入客户端 TrustStore,使客户端信任该 CA 颁发的所有证书:
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert
如果需要 Broker 也验证客户端证书,还需创建 Broker 的 TrustStore:
keytool -keystore broker.truststore.jks -alias CARoot -import -file ca-cert
证书签名流程
导出证书签名请求
从 Broker 的 KeyStore 中导出证书签名请求(CSR):
keytool -keystore broker.keystore.jks -alias localhost -certreq -file cert-file
使用 CA 签名证书
用私有 CA 为 Broker 证书签名:
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial -passin pass:ca-password
导入签名后的证书
将 CA 证书和签名后的 Broker 证书导入 KeyStore:
keytool -keystore broker.keystore.jks -alias CARoot -import -file ca-cert
keytool -keystore broker.keystore.jks -alias localhost -import -file cert-signed
Broker 端 TLS 配置
基础配置
在 broker.conf
中配置以下参数启用 TLS:
# 启用 KeyStore 类型的 TLS
tlsEnabledWithKeyStore=true
# KeyStore 配置
tlsKeyStoreType=JKS
tlsKeyStore=/var/private/tls/broker.keystore.jks
tlsKeyStorePassword=brokerpw
# TrustStore 配置
tlsTrustStoreType=JKS
tlsTrustStore=/var/private/tls/broker.truststore.jks
tlsTrustStorePassword=brokerpw
# 内部客户端配置
brokerClientTlsEnabled=true
brokerClientTlsEnabledWithKeyStore=true
brokerClientTlsTrustStoreType=JKS
brokerClientTlsTrustStore=/var/private/tls/client.truststore.jks
brokerClientTlsTrustStorePassword=clientpw
安全建议
- 使用文件系统权限严格控制 KeyStore 和 TrustStore 文件的访问
- 考虑禁用非 TLS 端口以强制使用加密通信:
brokerServicePort=
webServicePort=
- 高级安全配置选项:
tlsClientAuthentication
:启用双向 TLS 认证tlsCiphers
:指定允许的加密套件tlsProtocols
:限制允许的 TLS 协议版本
客户端 TLS 配置
命令行工具配置
在 client.conf
中配置:
webServiceUrl=https://broker.example.com:8443/
brokerServiceUrl=pulsar+ssl://broker.example.com:6651/
useKeyStoreTls=true
tlsTrustStoreType=JKS
tlsTrustStorePath=/var/private/tls/client.truststore.jks
tlsTrustStorePassword=clientpw
Java 客户端配置
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://broker.example.com:6651/")
.enableTls(true)
.useKeyStoreTls(true)
.tlsTrustStorePath("/var/private/tls/client.truststore.jks")
.tlsTrustStorePassword("clientpw")
.allowTlsInsecureConnection(false)
.build();
TLS 认证配置
Broker 端认证配置
在 broker.conf
中添加认证相关配置:
authenticationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderTls
# 设置超级用户角色(对应客户端证书的 CN)
superUserRoles=admin
# 要求客户端提供可信证书
requireTrustedClientCertOnConnect=true
# 内部客户端认证配置
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationKeyStoreTls
brokerClientAuthenticationParameters={"keyStoreType":"JKS","keyStorePath":"/var/private/tls/client.keystore.jks","keyStorePassword":"clientpw"}
客户端认证配置
Java 客户端示例:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://broker.example.com:6651/")
.enableTls(true)
.useKeyStoreTls(true)
.tlsTrustStorePath("/var/private/tls/client.truststore.jks")
.tlsTrustStorePassword("clientpw")
.authentication(
"org.apache.pulsar.client.impl.auth.AuthenticationKeyStoreTls",
"keyStoreType:JKS,keyStorePath:/var/private/tls/client.keystore.jks,keyStorePassword:clientpw")
.build();
故障排查
启用 TLS 调试日志
在 JVM 启动参数中添加:
-Djavax.net.debug=all
这将输出详细的 TLS 握手过程信息,有助于诊断连接问题。
最佳实践
- 定期轮换证书,建议有效期不超过 1 年
- 使用强密码保护 KeyStore 和 TrustStore 文件
- 在生产环境中禁用不安全的 TLS 协议版本(如 TLSv1.0、TLSv1.1)
- 使用专用 CA 而非公共 CA 签发内部证书
- 为不同环境(开发、测试、生产)使用不同的 CA
通过本文的详细指导,您应该能够在 Apache Pulsar 中成功配置基于 KeyStore 的 TLS 安全通信,为您的消息系统提供可靠的安全保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考