Hi Pulsar community,
I open a https://github.com/apache/pulsar/issues/15289 for Split client TLS
transport encryption from authentication.
Let me know what you think.
Thanks,
Zixuan
------
Motivation
The client supports TLS transport encryption and TLS authentication, this
code so like:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://localhost:6651")
.tlsTrustCertsFilePath("/path/to/cacert.pem")
.authentication(AuthenticationTls.class.getName(), authParams)
.build()
This causes an issue that cannot use other authentication with TLS
transport encryption, and also made our confusion if we use TLS transport
encryption by setting authentication.
Goal
Split client TLS transport encryption from authentication is used to
support TLS transport encryption with any authentication.
API Changes
- Add new methods in org.apache.pulsar.client.api.ClientBuilder
public interface ClientBuilder extends Serializable, Cloneable {
/** * Set the path to the TLS key file. * * @param
tlsKeyFilePath * @return the client builder instance */
ClientBuilder tlsKeyFilePath(String tlsKeyFilePath);
/** * Set the path to the TLS certificate file. * *
@param tlsCertificateFilePath * @return the client builder
instance */
ClientBuilder tlsCertificateFilePath(String tlsCertificateFilePath);
}
ImplementationTLS transport encryption
We can call the tlsKeyFilePath(), tlsCertificateFilePath() and
tlsTrustCertsFilePath() to configurate the TLS transport encryption, the
code so like:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://my-host:6650")
.tlsTrustCertsFilePath("/path/to/cacert.pem")
.tlsKeyFilePath("/path/to/client-key.pem")
.tlsCertificateFilePath("/path/to/client-cert.pem")
.build();
TLS transport encryption with any authentication
We can call the tlsKeyFilePath(), tlsCertificateFilePath(),
tlsTrustCertsFilePath() and authentication() to configurate the TLS
transport encryption with any authentication, the code so like:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar+ssl://my-host:6650")
.tlsTrustCertsFilePath("/path/to/cacert.pem")
.tlsKeyFilePath("/path/to/client-key.pem")
.tlsCertificateFilePath("/path/to/client-cert.pem")
.authentication(AuthenticationTls.class.getName() /*
AuthenticationToken.class.getName()*/, authParams)
.builder()
For AuthenticationTls, we need to do check the authParams, when the
authParams is empty, we need to read TLS config from ClientBuilder,
otherwise read from the authParams
Compatibility
None.