Authentication using TLS

TLS 身份验证概述

TLS 身份验证是 TLS 传输加密 的扩展。 不仅服务器有客户端用于验证服务器身份的密钥和证书, 客户端还有服务器用于验证客户端身份的密钥和证书。 You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.

Pulsar 使用了Bouncy Castle Provider 提供的 TLS 相关的密码套件和算法。 如果你需要 FIPS 版本的 Bouncy Castle Provider,请参考 Bouncy Castle 页面

创建客户证书

Client certificates are generated using the certificate authority. Server certificates are also generated with the same certificate authority.

The biggest difference between client certs and server certs is that the common name for the client certificate is the role token which that client is authenticated as.

首先,你需要输入文件夹命令才能生成密钥:

  1. $ openssl genrsa -out admin.key.pem 2048

与 broker 类似,客户端希望使用 PKCS 8 格式的秘钥。 所以需要通过输入下列命令来转换它。

  1. $ openssl pkcs8 -topk8 -inform PEM -outform PEM \
  2. -in admin.key.pem -out admin.key-pk8.pem -nocrypt

接下来,输入下面的命令来生成证书请求。 When you are asked for a common name, enter the role token that you want this key pair to authenticate a client as.

  1. $ openssl req -config openssl.cnf \
  2. -key admin.key.pem -new -sha256 -out admin.csr.pem

注意 如果未指定 openssl.cnf ,请读取 证书颁发机构 获取openssl.cnf。

然后输入下面的命令来与证书权威签约。 Note that the client certs uses the usr_cert extension, which allows the cert to be used for client authentication.

  1. $ openssl ca -config openssl.cnf -extensions usr_cert \
  2. -days 1000 -notext -md sha256 \
  3. -in admin.csr.pem -out admin.cert.pem

你可以从此命令获得证书、 admin.cert.pem和一个密钥。 admin.key-pk8.pem 使用 ca.cert. em, 客户可以使用此证书和此密钥向 broker 和 proxy 进行身份验证,作为 管理员

Note If the “unable to load CA private key” error occurs and the reason of this error is “No such file or directory: /etc/pki/CA/private/cakey.pem” in this step. Try the command below:

$ cd /etc/pki/tls/misc/CA $ ./CA -newca

  1. 生成 `cakey.pem`
  2. ## 在 broker 上启用 TLS 认证
  3. 要配置 broker 来验证客户端,请在 `broker.conf`中添加以下参数,和 [配置一起启用tls transport](security-tls-transport.md#broker-configuration):
  4. ```properties
  5. # Configuration to enable authentication
  6. authenticationEnabled=true
  7. authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderTls
  8. # operations and publish/consume from all topics
  9. superUserRoles=admin
  10. # Authentication settings of the broker itself. Used when the broker connects to other brokers, either in same or other clusters
  11. brokerClientTlsEnabled=true
  12. brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationTls
  13. brokerClientAuthenticationParameters={"tlsCertFile":"/path/my-ca/admin.cert.pem","tlsKeyFile":"/path/my-ca/admin.key-pk8.pem"}
  14. brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem

在 proxy 上启用 TLS 身份验证

要配置 proxy 服务器来验证客户端,请在 代理.conf的配置中加上 来启用tls transport:

代理服务器应该有自己的客户端密钥对。 你需要在 broker 的 代理角色 中配置此密钥对的角色标记。 详情请访问 认证指南

  1. # For clients connecting to the proxy
  2. authenticationEnabled=true
  3. authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderTls
  4. # For the proxy to connect to brokers
  5. brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationTls
  6. brokerClientAuthenticationParameters={"tlsCertFile":"/path/to/proxy.cert.pem","tlsKeyFile":"/path/to/proxy.key-pk8.pem"}

客户端配置

When you use TLS authentication, client connects via TLS transport. You need to configure the client to use https:// and 8443 port for the web service URL, pulsar+ssl:// and 6651 port for the broker service URL.

命令行工具

命令行工具 pulsar-admin, pulsar-perf pulsar-client 使用 conf/client. onf 配置文件在 Pulsar 安装中。

你需要添加以下参数到该文件以使用 Pulsar 的 CLI 工具使用 TLS 身份验证:

  1. webServiceUrl=https://broker.example.com:8443/
  2. brokerServiceUrl=pulsar+ssl://broker.example.com:6651/
  3. useTls=true
  4. tlsAllowInsecureConnection=false
  5. tlsTrustCertsFilePath=/path/to/ca.cert.pem
  6. authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationTls
  7. authParams=tlsCertFile:/path/to/my-role.cert.pem,tlsKeyFile:/path/to/my-role.key-pk8.pem

Java 客户端

  1. import org.apache.pulsar.client.api.PulsarClient;
  2. PulsarClient client = PulsarClient.builder()
  3. .serviceUrl("pulsar+ssl://broker.example.com:6651/")
  4. .enableTls(true)
  5. .tlsTrustCertsFilePath("/path/to/ca.cert.pem")
  6. .authentication("org.apache.pulsar.client.impl.auth.AuthenticationTls",
  7. "tlsCertFile:/path/to/my-role.cert.pem,tlsKeyFile:/path/to/my-role.key-pk8.pem")
  8. .build();

Python client

  1. from pulsar import Client, AuthenticationTLS
  2. auth = AuthenticationTLS("/path/to/my-role.cert.pem", "/path/to/my-role.key-pk8.pem")
  3. client = Client("pulsar+ssl://broker.example.com:6651/",
  4. tls_trust_certs_file_path="/path/to/ca.cert.pem",
  5. tls_allow_insecure_connection=False,
  6. authentication=auth)

C++ client

  1. #include <pulsar/Client.h>
  2. pulsar::ClientConfiguration config;
  3. config.setUseTls(true);
  4. config.setTlsTrustCertsFilePath("/path/to/ca.cert.pem");
  5. config.setTlsAllowInsecureConnection(false);
  6. pulsar::AuthenticationPtr auth = pulsar::AuthTls::create("/path/to/my-role.cert.pem",
  7. "/path/to/my-role.key-pk8.pem")
  8. config.setAuth(auth);
  9. pulsar::Client client("pulsar+ssl://broker.example.com:6651/", config);

Node.js 客户端

  1. const Pulsar = require('pulsar-client');
  2. (async () => {
  3. const auth = new Pulsar.AuthenticationTls({
  4. certificatePath: '/path/to/my-role.cert.pem',
  5. privateKeyPath: '/path/to/my-role.key-pk8.pem',
  6. });
  7. const client = new Pulsar.Client({
  8. serviceUrl: 'pulsar+ssl://broker.example.com:6651/',
  9. authentication: auth,
  10. tlsTrustCertsFilePath: '/path/to/ca.cert.pem',
  11. });
  12. })();

C# client

  1. var clientCertificate = new X509Certificate2("admin.pfx");
  2. var client = PulsarClient.Builder()
  3. .AuthenticateUsingClientCertificate(clientCertificate)
  4. .Build();