You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pulsar.apache.org by Yunze Xu <yz...@streamnative.io.INVALID> on 2022/04/18 07:16:51 UTC
Re: [Discuss] Generate cert and key files automatically
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 <no...@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 <yz...@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 <no...@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 <eo...@gmail.com> 于2022年3月22日周二 00:40写道:
>>>
>>>> Il giorno lun 21 mar 2022 alle ore 16:31 Yunze Xu
>>>> <yz...@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
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>
>>
Re: [Discuss] Generate cert and key files automatically
Posted by Zixuan Liu <no...@gmail.com>.
You are right, we need to spilt this point.
Yunze Xu <yz...@streamnative.io.invalid> 于2022年4月18日周一 15:17写道:
> 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 <no...@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 <yz...@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 <no...@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 <eo...@gmail.com> 于2022年3月22日周二 00:40写道:
> >>>
> >>>> Il giorno lun 21 mar 2022 alle ore 16:31 Yunze Xu
> >>>> <yz...@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
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>
> >>
>
>