> I think the priority of `AuthenticationTls` must be higher. Then it
should be encouraged to use `AuthenticationTls` when TLS authentication is
enabled at broker side. Otherwise, these two options should be encouraged
to use.

You are right, if we are set up the `AuthenticationTls` and TLS transport,
we should use the `AuthenticationTls` data to set up, `AuthenticationTls`
must be higher. When the user set up two config, we need to throw an
expectation that only use the `AuthenticationTls`, or `tlsCertFilePath` and
`tlsKeyFilePath`.


Yunze Xu <y...@streamnative.io.invalid> 于2022年3月23日周三 01:57写道:

> If `tlsCertFilePath` and `tlsKeyFilePath` were added to the client builder
> options, I think they can also be used for TLS authentication as well.
>
> I prefer this solution now just because it looks like generating
> certificats
> automatically is not good, from what Enrico said.
>
> The problem is that what if we configured both `AuthenticationTls` and
> those
> two options? Because the underlying mechanisms are the same that a
> `SslContext`
> is created from the cert and key files and then the `SslContext` object
> will be
> used in the TCP or HTTP transport.
>
> I think the priority of `AuthenticationTls` must be higher. Then it should
> be
> encouraged to use `AuthenticationTls` when TLS authentication is enabled at
> broker side. Otherwise, these two options should be encouraged to use.
>
> Thanks,
> Yunze
>
>
>
>
> > 2022年3月22日 上午11:03,Zixuan Liu <node...@gmail.com> 写道:
> >
> > Hi Yunze,
> >
> > The current implementation is confusing, we should split the transport
> and
> > auth for TLS.
> >
> > For transport, the code can be so like:
> > ```
> > PulsarClient client = PulsarClient.builder()
> >                .enableTls(true)
> >                .tlsTrustCertsFilePath("ca.pem")
> >                .tlsCertFilePath("client-ca.pem")
> >                .tlsKeyFilePath("client-key.pem")
> >                .build();
> > ```
> >
> > For auth, the code can be so like:
> > ```
> > Map<String, String> authParams = new HashMap<>();
> > authParams.put("tlsCertFile", "client-ca.pem");
> > authParams.put("tlsKeyFile", "client-key.pem");
> > PulsarClient client = PulsarClient.builder()
> >                .enableTls(true)
> >                .tlsTrustCertsFilePath("ca.pem")
> >                .authentication(AuthenticationTls.class.getName(),
> > authParams)
> >                .build();
> > ```
> >
> > When using the TLS auth, we don't need to set
> > tlsCertFilePath("client-ca.pem") and tlsKeyFilePath("client-key.pem"),
> the
> > authentication instead of this.
> >
> > There have an important thing that if we are using the authentication
> with
> > the token, we cannot setup the TLS transport.
> >
> >
> > Enrico Olivelli <eolive...@gmail.com> 于2022年3月22日周二 00:40写道:
> >
> >> Il giorno lun 21 mar 2022 alle ore 16:31 Yunze Xu
> >> <y...@streamnative.io.invalid> ha scritto:
> >>>
> >>> Hi all,
> >>>
> >>> Recently I found a document error when configuring Pulsar client for
> TLS
> >>> encryption. See https://github.com/apache/pulsar/issues/14762.
> However,
> >> the code
> >>> example in the official documents is more intuitive.
> >>>
> >>> See
> >> https://pulsar.apache.org/docs/en/security-tls-transport/#java-client,
> the
> >>> example code doesn't configure `AuthenticationTls`, but it is required
> >> once TLS
> >>> encryption is enabled, even if TLS authentication is not enabled.
> >> Because the
> >>> client side can only send a SSL handshake via `AuthenticationTls`. It
> >> would be
> >>> confused.
> >>>
> >>> Since the cert file and the key file are generated using a CA, whose
> >> path is
> >>> specified by `tlsTrustCertsFilePath` method, I think it would be
> >> possible to
> >>> generate a cert and a key file automatically. We only need to specify a
> >> common
> >>> name, which represents the role when authentication is enabled.
> >>
> >> Usually a service cannot generate a "valid" certificate automatically,
> >> it MUST be signed by a CA.
> >>
> >> We may add an option to automatically generate a certificate (and a
> >> CA) but that will work only for
> >> DEV environments.
> >>
> >> Enrico
> >>
> >>
> >>>
> >>> My initial design is, when client configures the
> `tlsTrustCertsFilePath`:
> >>> - If no authentication plugin is enabled, generate the cert and key
> files
> >>>  automatically using a default common name.
> >>> - Otherwise, use the cert and key files specified in
> `AuthenticationTls`.
> >>>
> >>> The benefit is, when you want to pass the TLS authentication, you must
> >> configure
> >>> `AuthenticationTls` at client side, while you only needs to configure
> >>> `tlsTrustCertsFilePath` if broker side only enables TLS encryption.
> >>>
> >>> What do you think? Is there a better solution?
> >>>
> >>> Thanks,
> >>> Yunze
> >>>
> >>>
> >>>
> >>>
> >>
>
>

Reply via email to