Apache Pulsar 中使用 KeyStore 配置 TLS 安全通信指南

Apache Pulsar 中使用 KeyStore 配置 TLS 安全通信指南

pulsar Apache Pulsar - distributed pub-sub messaging system pulsar 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar

前言

在现代分布式系统中,数据传输安全是至关重要的。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

安全建议

  1. 使用文件系统权限严格控制 KeyStore 和 TrustStore 文件的访问
  2. 考虑禁用非 TLS 端口以强制使用加密通信:
brokerServicePort=
webServicePort=
  1. 高级安全配置选项:
    • 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. 定期轮换证书,建议有效期不超过 1 年
  2. 使用强密码保护 KeyStore 和 TrustStore 文件
  3. 在生产环境中禁用不安全的 TLS 协议版本(如 TLSv1.0、TLSv1.1)
  4. 使用专用 CA 而非公共 CA 签发内部证书
  5. 为不同环境(开发、测试、生产)使用不同的 CA

通过本文的详细指导,您应该能够在 Apache Pulsar 中成功配置基于 KeyStore 的 TLS 安全通信,为您的消息系统提供可靠的安全保障。

pulsar Apache Pulsar - distributed pub-sub messaging system pulsar 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虞旋律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值