I have another concern that since we have to use `AuthenticationTls` for TLS
transport encryption, how can we perform a non-TLS authentication? It looks
like there’s no way to do that.

Thanks,
Yunze




> 2022年3月23日 11:24,Zixuan Liu <node...@gmail.com> 写道:
> 
>> 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