ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Apache Pulsar 传输层加密实战指南:基于 TLS 的 Broker、Proxy 与多语言客户端全链路配置

Apache Pulsar 传输层加密实战指南:基于 TLS 的 Broker、Proxy 与多语言客户端全链路配置 Apache Pulsar 传输层加密实战指南基于 TLS 的 Broker、Proxy 与多语言客户端全链路配置【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar本文以 Apache Pulsar 官方安全文档 security-tls-transport.md 为主体结合当前仓库中的 broker.conf、proxy.conf、client.conf 以及 PulsarService.java 等源码与配置系统讲解 Pulsar 的 TLS 传输加密原理、证书签发全流程以及 Broker、Proxy、CLI 工具和 Java/Python/C/Node.js/C# 客户端的完整配置方法。读完本文你将能够独立为 Pulsar 集群启用端到端的 TLS 传输加密并掌握协议版本、密码套件与主机名校验等安全加固手段。TLS 概述为什么默认传输不安全默认情况下Apache Pulsar 客户端与 Pulsar 服务端之间以明文进行通信也就是说所有数据包括消息内容与元数据在网络上都是裸奔的。攻击者只要能够监听网络即典型的中间人攻击场景就可以窃取或篡改传输中的数据。启用 TLS 可以对这条链路进行加密从而抵御中间人窃听。TLS 不仅可以用作传输加密还可以在加密的同时承担身份认证职责。本文聚焦于纯粹的传输加密配置如需在 TLS 之上叠加基于证书的客户端认证可参见 security-tls-authentication.md也可以先启用 TLS 传输加密再叠加其他认证机制如 Athenz。注意启用 TLS 会引入加解密的计算开销可能对性能产生一定影响需要在安全性与吞吐之间做权衡。TLS 核心概念TLS 基于公钥密码学public key cryptography实现。每一对密钥由公钥与私钥组成公钥用于加密消息私钥用于解密消息。要在 Pulsar 中启用 TLS 传输加密你至少需要两类密钥对服务端密钥对server key pairs由每个 Broker / Proxy 持有。证书颁发机构Certificate AuthorityCA用于签发并背书上述证书。如果需要客户端认证还需要第三类密钥对——客户端密钥对client key pairs具体见 security-tls-authentication.md。CA 的私钥必须存放在极其安全的位置理想情况下是完全离线、物理隔离、全盘加密的计算机而 CA 的公钥——即信任证书trust cert——可以自由分发。对于客户端与服务端的每一对密钥管理员的流程是统一的先生成私钥和证书签名请求CSR再用 CA 私钥对 CSR 签名最终生成一张证书certificate。这张证书本质上是该密钥对的公钥载体。在传输加密场景下客户端使用 CA 的trust cert来验证服务端持有的密钥对确实由该 CA 签发。中间人攻击者无法接触 CA 私钥因此无法伪造出具有合法签名密钥对的服务端。在TLS 认证场景下服务端反过来用 trust cert 验证客户端密钥对是否由 CA 签发并将**客户端证书的 Common NameCN**作为该客户端的角色令牌role token参见 安全概览。此外Pulsar 的密码套件与算法由Bouncy Castle Provider提供。如果需要 FIPS 版本的 Bouncy Castle Provider请参考 security-bouncy-castle.md。创建 TLS 证书为 Pulsar 创建 TLS 证书需要依次完成三件事创建证书颁发机构CA、创建服务端证书、创建客户端证书。下面的步骤全部基于 OpenSSL 命令行。你也可以参考网络上更详尽的 OpenSSL CA 搭建资料。当前仓库中提供了一份可直接使用的 OpenSSL 配置文件site2/website/static/examples/openssl.cnf。这份配置以环境变量CA_HOME定位 CA 目录下的所有文件与子目录certs、crl、newcerts、private、index.txt、serial等并预置了v3_ca、server_cert、usr_cert等扩展模板。另外仓库的 tests/certificate-authority/openssl.cnf 还保存了一份用于集成测试的同类配置可作为对照。创建证书颁发机构CA为 CA 创建证书。CA 将同时用于签发 Broker 证书和客户端证书从而保证各方相互信任。CA 应存放在非常安全的位置理想情况是完全离线、隔离网络且全盘加密。执行以下命令创建 CA 目录并把 openssl 配置文件放入该目录。你可以按需修改配置文件中的默认公司名、部门等应答项。将 CA 目录位置导出为环境变量CA_HOME——配置文件正是通过该变量定位其余文件与目录mkdir my-ca cd my-ca wget https://raw.githubusercontent.com/apache/pulsar/master/site2/website/static/examples/openssl.cnf export CA_HOME$(pwd)执行以下命令创建必要的目录、密钥与证书mkdir certs crl newcerts private chmod 700 private/ touch index.txt echo 1000 serial openssl genrsa -aes256 -out private/ca.key.pem 4096 chmod 400 private/ca.key.pem openssl req -config openssl.cnf -key private/ca.key.pem \ -new -x509 -days 7300 -sha256 -extensions v3_ca \ -out certs/ca.cert.pem chmod 444 certs/ca.cert.pem回答完提示问题后CA 相关文件将存放在./my-ca目录中certs/ca.cert.pem公开证书需要分发给所有参与方即信任证书 / trust cert。private/ca.key.pem私钥仅在为 Broker 或客户端签发新证书时需要用到必须严加保管。上面使用的v3_ca扩展在 openssl.cnf 中定义为basicConstraints critical, CA:true与keyUsage critical, digitalSignature, cRLSign, keyCertSign这正是 CA 证书应有的关键属性。创建服务端证书创建好 CA 证书后就可以生成证书请求并用 CA 为其签名。下面的命令会询问若干问题然后生成证书。当被问到Common Name时应填入 Broker 的主机名也可以使用通配符匹配一组 Broker 主机名例如*.broker.usw.example.com这样多台机器可以复用同一张证书。提示有些场景下无法或没必要匹配主机名——例如 Broker 的主机名是随机生成的或者你打算通过 IP 直连主机。此时应配置客户端关闭 TLS 主机名校验详见下文客户端配置中的主机名校验小节。执行以下命令生成私钥openssl genrsa -out broker.key.pem 2048Broker 期望私钥是PKCS 8格式因此执行以下命令进行转换openssl pkcs8 -topk8 -inform PEM -outform PEM \ -in broker.key.pem -out broker.key-pk8.pem -nocrypt执行以下命令生成证书签名请求openssl req -config openssl.cnf \ -key broker.key.pem -new -sha256 -out broker.csr.pem用证书颁发机构对其签名openssl ca -config openssl.cnf -extensions server_cert \ -days 1000 -notext -md sha256 \ -in broker.csr.pem -out broker.cert.pem此时你拥有了证书broker.cert.pem与私钥broker.key-pk8.pem它们可以与ca.cert.pem一起用于为 Broker 和 Proxy 节点配置 TLS 传输加密。这里使用的server_cert扩展在 openssl.cnf 中定义了extendedKeyUsage serverAuth确保该证书仅用于服务端认证。创建客户端证书客户端证书的生成流程与服务端证书完全一致生成私钥 → 生成 CSR → 用 CA 签名。区别在于签发时使用usr_cert扩展其extendedKeyUsage clientAuth, emailProtection见 openssl.cnf。客户端证书主要用于TLS 认证即客户端向服务端证明身份具体配置方法见 security-tls-authentication.md。如果你只需要传输加密则不必为客户端签发证书。配置 Broker要为 Pulsar Broker 启用 TLS 传输加密需要修改 Pulsar 安装目录conf下的 broker.conf。在 Pulsar 单机安装 中该文件位于conf/broker.conf。在配置文件中追加以下配置项将证书路径替换为实际路径brokerServicePortTls6651 webServicePortTls8081 tlsRequireTrustedClientCertOnConnecttrue tlsCertificateFilePath/path/to/broker.cert.pem tlsKeyFilePath/path/to/broker.key-pk8.pem tlsTrustCertsFilePath/path/to/ca.cert.pem各参数含义如下均可在 conf/broker.conf 的 TLS 段找到对应注释参数默认值说明brokerServicePortTls空TLS 默认关闭二进制协议生产/消费的 TLS 监听端口示例取 6651webServicePortTls空TLS 默认关闭HTTP/HTTPS 管理接口的 TLS 监听端口示例取 8081tlsRequireTrustedClientCertOnConnectfalse是否强制要求连接方提供受信任的客户端证书为true时拒绝未通过tlsTrustCertsFilePath校验的客户端连接等效于强制客户端 TLS 认证tlsCertificateFilePath空Broker 服务端证书如broker.cert.pem路径tlsKeyFilePath空Broker 私钥必须是 PKCS 8 格式如broker.key-pk8.pem路径tlsTrustCertsFilePath空用于校验连接方证书的信任证书如ca.cert.pem路径校验失败则连接被拒绝关于端口需要注意brokerServicePortTls与webServicePortTls均为可选端口。从 PulsarService.java 可以看到Broker 启动时会校验 web 服务端口与 TLS 端口至少存在一个否则抛出IllegalArgumentException随后启动的 TLS 监听地址会被记录为webServiceAddressTls与brokerServiceUrlTls并在 PulsarService.java 中注入内部客户端与服务发现逻辑。此外broker.conf 还包含以下值得了解的 TLS 相关配置tlsCertRefreshCheckDurationSec300TLS 证书刷新检查周期秒设为0表示每个新连接都重新检查。这意味着证书轮换后无需重启 Broker 即可在下一个周期内生效。tlsAllowInsecureConnectionfalse是否接受无法用tlsTrustCertsFilePath验证的客户端证书注意这与客户端的allowInsecureConnection是不同方向的概念。生产环境应保持false。tlsHostnameVerificationEnabledfalseBroker 与其他 Broker 建立 TLS 连接时是否校验主机名。tlsProviderBroker 服务二进制协议使用的 TLS Provider。使用 CA 证书做 TLS 认证时可选OPENSSL或JDK使用 KeyStore 时可选SunJSSE、Conscrypt等。webServiceTlsProviderConscryptWeb 服务默认使用 Conscrypt 作为 TLS Provider。tlsEnabledWithKeyStorefalse及一组tlsKeyStore*/tlsTrustStore*启用 KeyStore 类型的 TLS 配置JKS / PKCS12。brokerClientTlsEnabledfalse、brokerClientTrustCertsFilePathBroker 作为内部客户端连接其他 Broker 或集群复制时的 TLS 开关与信任证书路径。弃用项tlsEnabled旧版统一开关已弃用请改用brokerServicePortTls与webServicePortTls。更多参数及默认值的完整清单见 Broker 配置参考。TLS 协议版本与密码套件可以配置 Broker以及 Proxy在 TLS 协商时强制使用指定的协议版本与密码套件从而防止客户端回退downgrade到存在弱点的旧协议或旧密码。协议版本与密码套件属性均支持以逗号分隔的多个值。可选值取决于你使用的 TLS ProviderPulsar优先使用 OpenSSL若系统可用否则回退到 JDK 实现。tlsProtocolsTLSv1.3,TLSv1.2 tlsCiphersTLS_DH_RSA_WITH_AES_256_GCM_SHA384,TLS_DH_RSA_WITH_AES_256_CBC_SHAOpenSSL 目前支持TLSv1.1、TLSv1.2和TLSv1.3协议版本可通过openssl ciphers -tls1_3等命令查询当前 OpenSSL 支持的密码套件列表。JDK 11 的支持值可从官方文档获取TLS 协议参数与 SunJSSE 密码套件两个章节。需要注意的是broker.conf 中还单独提供了webServiceTlsProtocols与webServiceTlsCiphers用于分别控制Web 服务HTTPS 管理接口的协议与密码套件而tlsProtocols/tlsCiphers控制的是二进制协议端口。同时Broker 内部客户端与其他 Broker 通信的协议与密码由brokerClientTlsProtocols/brokerClientTlsCiphers控制——在 PulsarService.java 中可以看到这些值被注入到内部 Pulsar 客户端的setTlsCiphers/setTlsProtocols。配置 ProxyProxy 需要在两个方向上配置 TLS一是面向连接 Proxy 的客户端二是 Proxy 连接Broker的方向。相关配置位于 conf/proxy.conf。# For clients connecting to the proxy tlsEnabledInProxytrue tlsCertificateFilePath/path/to/broker.cert.pem tlsKeyFilePath/path/to/broker.key-pk8.pem tlsTrustCertsFilePath/path/to/ca.cert.pem # For the proxy to connect to brokers tlsEnabledWithBrokertrue brokerClientTrustCertsFilePath/path/to/ca.cert.pem对应 conf/proxy.conf 中的实际配置项面向客户端方向tlsEnabledInProxytrue该开关在 proxy.conf 中标注为已弃用新的方式是直接设置 TLS 监听端口servicePortTls二进制协议与webServicePortTlsWeb 服务。弃用项保留仅为兼容。tlsCertificateFilePath/tlsKeyFilePathProxy 对外提供服务时使用的证书与 PKCS 8 私钥可以复用为 Broker 签发的服务端证书。tlsTrustCertsFilePath用于校验客户端证书的信任证书。面向 Broker 方向tlsEnabledWithBrokertrue是否在 Proxy 与 Broker 之间启用 TLS。brokerClientTrustCertsFilePath/path/to/ca.cert.pemProxy 作为客户端连接 Broker 时使用的信任证书路径见 proxy.conf 注释。此外还可配置tlsHostnameVerificationEnabledProxy 连接 Broker 时是否校验主机名、tlsCertRefreshCheckDurationSec300证书刷新周期等。与 Broker 一样proxy.conf 也提供tlsProtocols/tlsCiphers二进制协议与webServiceTlsProtocols/webServiceTlsCiphersWeb 服务两组协议与密码套件配置以及tlsRequireTrustedClientCertOnConnect强制客户端证书与 KeyStore 系列配置tlsEnabledWithKeyStore等。客户端配置启用 TLS 传输加密后客户端需要改用加密协议与对应端口Web 服务 URL使用https://端口 8443对应 Broker 的webServicePortTls。Broker 服务 URL使用pulsarssl://端口 6651对应 Broker 的brokerServicePortTls。由于上文生成的服务端证书不属于任何系统默认信任链你还必须显式指定 trust cert 路径推荐或者允许客户端信任未受信任的服务端证书不推荐见下文主机名校验讨论。主机名校验Hostname verification主机名校验是 TLS 的一项安全特性客户端在连接时若服务器证书的Common NameCN与正在连接的主机名不匹配则拒绝连接。默认情况下Pulsar 客户端关闭主机名校验因为开启它要求每个 Broker 都有对应的 DNS 记录和独立证书。与此同时由于管理员完全掌控证书颁发机构攻击者极难实施中间人攻击。关于allowInsecureConnection允许连接证书未经受信任 CA 签名的服务器客户端默认关闭该选项生产环境应当始终保持关闭。只要关闭allowInsecureConnection中间人攻击就要求攻击者同时掌握 CA 的私钥——这正是把 CA 私钥离线保管的价值所在。一个推荐开启主机名校验的场景是多个 Proxy 节点位于 VIP 之后且 VIP 有 DNS 记录例如pulsar.mycompany.com。此时可以为pulsar.mycompany.com生成一张 CN 为此域名的 TLS 证书然后在客户端开启主机名校验。下面示例以 Java 客户端展示主机名校验的显式关闭写法其实该选项默认就是关闭的可以省略。C/Python/Node.js 客户端目前不支持配置该项。CLI 工具命令行工具如pulsar-admin、pulsar-perf、pulsar-client统一读取 Pulsar 安装目录中的 conf/client.conf。要使这些工具走 TLS需要在该文件中追加以下参数webServiceUrlhttps://broker.example.com:8443/ brokerServiceUrlpulsarssl://broker.example.com:6651/ useTlstrue tlsAllowInsecureConnectionfalse tlsTrustCertsFilePath/path/to/ca.cert.pem tlsEnableHostnameVerificationfalse对照 conf/client.conf 中的实际注释webServiceUrlREST API管理操作地址TLS 时为https://…:8443/。brokerServiceUrl二进制协议生产/消费地址TLS 时为pulsarssl://…:6651/。tlsAllowInsecureConnectionfalse是否允许连接证书无法验证的服务器默认false。tlsEnableHostnameVerificationfalse是否要求服务器主机名与证书 CN 一致默认false。tlsTrustCertsFilePath信任证书路径用于校验服务器证书是否由该 CA 签发校验失败则连接被断开。此外若需要客户端证书认证可配置authPluginorg.apache.pulsar.client.impl.auth.AuthenticationTls与authParamstlsCertFile:/path/to/client-cert.pem,tlsKeyFile:/path/to/client-key.pem以及 KeyStore 模式下的useKeyStoreTls/tlsTrustStore*系列参数。Java 客户端import org.apache.pulsar.client.api.PulsarClient; PulsarClient client PulsarClient.builder() .serviceUrl(pulsarssl://broker.example.com:6651/) .enableTls(true) .tlsTrustCertsFilePath(/path/to/ca.cert.pem) .enableTlsHostnameVerification(false) // false by default, in any case .allowTlsInsecureConnection(false) // false by default, in any case .build();Python 客户端from pulsar import Client client Client(pulsarssl://broker.example.com:6651/, tls_hostname_verificationTrue, tls_trust_certs_file_path/path/to/ca.cert.pem, tls_allow_insecure_connectionFalse) # defaults to false from v2.2.0 onwardsC 客户端#include pulsar/Client.h ClientConfiguration config ClientConfiguration(); config.setUseTls(true); // shouldnt be needed soon config.setTlsTrustCertsFilePath(caPath); config.setTlsAllowInsecureConnection(false); config.setAuth(pulsar::AuthTls::create(clientPublicKeyPath, clientPrivateKeyPath)); config.setValidateHostName(true);Node.js 客户端const Pulsar require(pulsar-client); (async () { const client new Pulsar.Client({ serviceUrl: pulsarssl://broker.example.com:6651/, tlsTrustCertsFilePath: /path/to/ca.cert.pem, }); })();C# 客户端var certificate new X509Certificate2(ca.cert.pem); var client PulsarClient.Builder() .TrustedCertificateAuthority(certificate) //If the CA is not trusted on the host, you can add it explicitly. .VerifyCertificateAuthority(true) //Default is true .VerifyCertificateName(false) //Default is false .Build();验证与后续完成上述配置后可以用pulsar-client已配置 TLS 的 CLI尝试生产/消费一条消息确认链路可通也可以使用openssl s_client -connect broker.example.com:6651 -CAfile ca.cert.pem之类的手段直接检查 TLS 握手与证书链。如果在启用 TLS 传输加密的同时还需要客户端身份认证请继续阅读 security-tls-authentication.md若需要 FIPS 合规的 Bouncy Castle Provider参考 security-bouncy-castle.md所有 Broker 配置项的完整默认值清单见 reference-configuration.md。【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表