Thanks Jakub .. for your inputs & help in this !
I was able to get this to work last week..

On Thu, Sep 21, 2017 at 12:22 AM, Jakub Scholz <ja...@scholz.cz> wrote:

> Hi,
>
> If you want the Kafka broker to present the whole chain you have to use the
> chain when creating the PKCS12 file (use the chain instead of the host
> certificate). As you mentioned, the chain should be in the order 1) server
> cert, 2) intermediate cert and 3) root cert. It will be then automatically
> imported into the keystore. When you use -showcerts option in "openssl
> s_client it should show the whole chain. The intermediate and root cert
> alone can be imported into the keystore / truststore directly, it doesn't
> need to be through PKCS12. But as mentioned before, to have the broker
> present the whole chain you have to load the chain already into the PKCS12.
> Loading the chain parts separately into the keystore will not help.
>
> In the openssl s_client you can also use the -CAfile option to point it to
> the intermediate certificate - that would also wirk but using the whole
> chain is probably better.
>
> Regards
> Jakub
>
> On Thu, Sep 21, 2017 at 2:00 AM, karan alang <karan.al...@gmail.com>
> wrote:
>
> > Another point ..
> > on adding the chain.p12 (PKCS#12 format) .. order of the certs in the
> > keystore is as shown below
> >
> > Alias : 1
> > Cert[1] -> server cert
> > Cert[2] -> Intermediate cert
> > Cert[3] -> Root cert
> >
> > mentioning that, since one of the articles i read mentioned that the
> certs
> > imported should be in following order ->  1) Root 2) Intermediate 3)
> Server
> >
> >
> > On Wed, Sep 20, 2017 at 4:48 PM, karan alang <karan.al...@gmail.com>
> > wrote:
> >
> > > Hi Jakub,
> > >
> > > Thanks for the detailed note...
> > >
> > > here is the update ->
> > >
> > > I was able to convert the host.cert.pem to PKCS#12 & import the cert
> into
> > > the kafka.server.keystore.jks
> > > (also into kafka.server.truststore.jks)
> > > wrt the host.root.pem & host.intermed.pem certs - i'm assuming i need
> to
> > > convert them to PKCS#12 as well ?
> > > Or do i import them as PEM file ?
> > >
> > > I was not able to convert them to PKCS#12(since i understand the
> PKCS#12
> > > format requires a private key & the root.pem & intermed.pem donot have
> a
> > > private key associated)
> > > the error is shown below -
> > >
> > > openssl pkcs12 -export -out intermed.p12 -in hostname.issuer.pem -inkey
> > >> privatekey-kafka04-0920.key.pem -password pass:<password>
> > >> Enter pass phrase for privatekey-kafka04-0920.key.pem:
> > >> No certificate matches private key
> > >
> > >
> > >
> > > What i did next ->
> > >
> > > The host.chain.cert has all the 3 certs (server, intermediate, root)
> > > and i converted this to PKCS format & also was able to import into the
> > > keystore/truststore.
> > > I'm able to see the 3 certificates in the keystore/truststore under ONE
> > > alias.
> > >
> > >
> > > Now i get a different error shown below ->
> > >
> > > Command :
> > > openssl s_client -debug -connect <hostname>:9192 -tls1
> > >
> > > Error :
> > >
> > > depth=0 CN = <hostname>, OU = <OU>, O = <Organization>, ST = <State>,
> C =
> > >> US
> > >> verify error:num=20:unable to get local issuer certificate
> > >> verify return:1
> > >> depth=0 CN = <hostname>, OU = <OU>, O = <Organization>, ST = <State>,
> C
> > =
> > >> US
> > >> verify error:num=27:certificate not trusted
> > >> verify return:1
> > >> depth=0 CN = <hostname>, OU = <OU>, O = <Organization>, ST = <State>,
> C
> > =
> > >> US
> > >> verify error:num=21:unable to verify the first certificate
> > >> verify return:1
> > >> write to 0xd47830 [0xd98100] (12 bytes => 12 (0xC))
> > >> ---------
> > >> ---------
> > >> 0930 - 74 20 47 6c 6f 62 61 6c-20 43 41 0e               t Global CA.
> > >> 093f - <SPACES/NULS>
> > >> write to 0xd47830 [0xd98100] (37 bytes => -1 (0xFFFFFFFFFFFFFFFF))
> > >> 140456850737056:error:1408E0F4:SSL routines:SSL3_GET_MESSAGE:
> unexpected
> > >> message:s3_both.c:491:
> > >> --------
> > >> --------
> > >> SSL-Session:
> > >>     Protocol  : TLSv1
> > >> ------
> > >> ------
> > >>     Timeout   : 7200 (sec)
> > >>     Verify return code: 21 (unable to verify the first certificate)
> > >
> > >
> > >
> > > Any ideas on how to fix this ?
> > >
> > >
> > > On Wed, Sep 20, 2017 at 2:22 PM, Jakub Scholz <ja...@scholz.cz> wrote:
> > >
> > >> ad 1) The problem is that the signed certificate (host.cert.pem) which
> > the
> > >> CA provides is only the public key. You have to combine it with the
> > >> private
> > >> key which you created when requesting the signed certificate. The
> > private
> > >> key is never sent to the CA so they cannot provide it back. You or
> > whoever
> > >> created the signing request should have it.
> > >>
> > >> ad 2) To create the keystore with your signed key, you have to take
> the
> > >> signed public key and the private key and create P12 file:
> > >> $ openssl pkcs12 -export -out server.p12 -in host.cert.pem -inkey
> > host.key
> > >> -password pass:somepassword
> > >>
> > >> And afterwards convert it to keystore format:
> > >> $ keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12
> > >> -srcstorepass somepassword -destkeystore server.keystore
> -deststoretype
> > >> JKS
> > >> -deststorepass somepassword -noprompt
> > >>
> > >> You can add the intermediate and root to the keystore as well. But
> when
> > it
> > >> tells you that you already have them in the system wide keystore say
> > "yes"
> > >> that you want to add them to the keystore again.
> > >>
> > >> ad 3) Do you want your clients to authenticate with a client
> > certificates?
> > >> If not, you should not need the truststore for the broker. You only
> > need a
> > >> truststore for the client which should contain the root and the
> > >> intermediate certificates. If you want clients to authenticate using
> > >> certificates you have to do basically the same as above for the client
> > >> (You
> > >> should use different certificate for cleints from the one in server -
> > for
> > >> security reasons ;-)).
> > >>
> > >> ad 4) As I said, I think what you did before was that the broker
> > basically
> > >> uses the self-signed cert you generated. This is probably the default
> > >> subject distinguished name of the self signed certificate. And since
> it
> > is
> > >> self-signed openssl cannot verify its identity (unless you pass it the
> > >> public key of this exact self signed certificate).
> > >>
> > >> Jakub
> > >>
> > >> On Wed, Sep 20, 2017 at 10:46 PM, karan alang <karan.al...@gmail.com>
> > >> wrote:
> > >>
> > >> > Hello
> > >> > - thanks for the response
> > >> > Here is the update on the issue.
> > >> >
> > >> > I'm using certs signed/provided by org-wide CA (geotrust, not a
> > >> self-signed
> > >> > cert)
> > >> > The Signed(by the CA - geotrust) cert provided has 3 certificates
> > >> > - host.chain.pem (certificate chain - contains the Root,
> Intermediate,
> > >> > Signed Server cert )
> > >> > - host.intermediate.pem (intermediate certificate)
> > >> > - host.cert.pem (signed server sert)
> > >> > Steps :
> > >> > 1) Added the signed cert to kafka.server.keystore.jks
> > >> >
> > >> >
> > >> > >  keytool -import -alias servercert -trustcacerts -file
> host.cert.pem
> > >> > > -keystore kafka.server.keystore.jks
> > >> >
> > >> >
> > >> > *btw, Is the command above correct or needs to be changed ? *
> > >> >
> > >> > 2) Added the Intermediate & Signed cert to kafka.server.keystore.jks
> > >> >
> > >> > > keytool -import -alias intermediate -trustcacerts -file
> > >> host.issuer.pem
> > >> > > -keystore kafka.server.truststore.jks
> > >> > > keytool -import -alias servercert -trustcacerts -file
> host.cert.pem
> > >> > > -keystore kafka.server.truststore.jks
> > >> >
> > >> >
> > >> > When i try to add the Root Cert, it shows the following message.
> > >> >
> > >> > *Enter keystore password:  *
> > >> > * Certificate already exists in system-wide CA keystore under alias
> > >> > <geotrustglobalca [jdk]>*
> > >> > * Do you still want to add it to your own keystore? [no]:  *
> > >> >
> > >> > So, i assume the CA is already trusted .. do i still need to add
> this
> > to
> > >> > the kafka.server.truststore.jks ?
> > >> > (I think i did that, and it did not fix the issue)
> > >> > 3) In the Broker side (server.properties file), the setting is as
> > shown
> > >> > below
> > >> > (this is the same setting when i enabled SSL using OpenSSL, which is
> > >> > working fine btw)
> > >> >
> > >> > > ssl.keystore.location=/usr/hdp/2.5.3.0-37/confluent-3.2.
> > >> > > 2/kafkaSSL/kafka.server.keystore.jks
> > >> > > ssl.keystore.password=<passwd>
> > >> > > ssl.key.password=<passwd>
> > >> > > ssl.truststore.location=/usr/hdp/2.5.3.0-37/confluent-3.2.
> > >> > > 2/kafkaSSL/kafka.server.truststore.jks
> > >> > > ssl.truststore.password=<passwd>
> > >> > > ssl.client.auth=required
> > >> >
> > >> > 4) when i verify the SSL using command below
> > >> >
> > >> >  Command :
> > >> >
> > >> > >  openssl s_client -debug -connect <hostname>:9192 -tls1
> > >> >
> > >> >
> > >> >  Error snippet :
> > >> >
> > >> >
> > >> > >
> > >> > >
> > >> > > depth=0 C = US, ST = <State Name>, L = Unknown, O = <org name>.,
> OU
> > =
> > >> > > <OU>, CN = <localhost>
> > >> > >
> > >> > verify error:num=18:self signed certificate
> > >> > >
> > >> > > verify return:1
> > >> > >  ....................
> > >> > >
> > >> >              -----------------
> > >> >              ------------------
> > >> >
> > >> >
> > >> > >  063d - <SPACES/NULS>
> > >> > > write to 0x860830 [0x8b1100] (37 bytes => -1 (0xFFFFFFFFFFFFFFFF))
> > >> > > 140487373043616:error:1408E0F4:SSL routines:SSL3_GET_MESSAGE:unex
> > >> pected
> > >> > > message:s3_both.c:491:
> > >> >
> > >> >
> > >> > Any ideas on this ?
> > >> >         What needs to be done to debug or fix this ?
> > >> >
> > >> > On Wed, Sep 20, 2017 at 12:33 AM, Jakub Scholz <ja...@scholz.cz>
> > wrote:
> > >> >
> > >> > > Hi,
> > >> > >
> > >> > > Looking at your commands it looks as if you generated a self
> signed
> > >> key
> > >> > for
> > >> > > server, self signed key for client and then imported the CA keys
> > >> public
> > >> > > keys into the truststores. I don’t think this will work because
> now
> > >> you
> > >> > > have two different self signed keys in the keystores and the
> > >> presumably
> > >> > the
> > >> > > CA public key in your truststores.
> > >> > >
> > >> > > Does the cert.pem actualy contain the private key? In case it
> > doesn’t
> > >> > > contain the private key you need to get the private key first. If
> > yes,
> > >> > you
> > >> > > have to convert it into the keystore format using this guide:
> > >> > > https://docs.oracle.com/cd/E35976_01/server.740/es_admin/
> > >> > > src/tadm_ssl_convert_pem_to_jks.html
> > >> > > You basically have to first use OpenSSL to create PKCS12 key and
> > that
> > >> can
> > >> > > be converted into keystore.
> > >> > >
> > >> > > BTW: If you run your application with system property
> > >> “javax.net.debug”
> > >> > set
> > >> > > to “ssl” it will generate a lot of useful debug information which
> > will
> > >> > help
> > >> > > to understand what is going on and fix this.
> > >> > >
> > >> > > Jakub
> > >> > >
> > >> > > On Tue, 19 Sep 2017 at 23:44, karan alang <karan.al...@gmail.com>
> > >> wrote:
> > >> > >
> > >> > > > Hello All -
> > >> > > > I was able to set up SSL for the Kafka brokers, using OpenSSL.
> > >> > > >
> > >> > > > however, I'm having issues with setting up SSL using the pem
> file
> > >> (i.e.
> > >> > > SSL
> > >> > > > certificate - certified by CA, provided by the company)
> > >> > > >
> > >> > > > Here is what i've done -
> > >> > > > created the server/client keystore & truststore files and
> imported
> > >> the
> > >> > > > provided cert.pem file
> > >> > > >
> > >> > > > keytool -keystore kafka.server.keystore.jks -alias localhost
> > >> -validity
> > >> > > 365
> > >> > > > -genkey
> > >> > > > keytool -keystore kafka.server.truststore.jks -alias CARoot
> > -import
> > >> > -file
> > >> > > > cert.pem
> > >> > > > keytool -keystore kafka.client.truststore.jks -alias CARoot
> > -import
> > >> > -file
> > >> > > > cert.pem
> > >> > > > keytool -keystore kafka.server.keystore.jks -alias CARoot
> -import
> > >> -file
> > >> > > > cert.pem
> > >> > > > keytool -keystore kafka.client.keystore.jks -alias localhost
> > >> -validity
> > >> > > 365
> > >> > > > -genkey
> > >> > > > keytool -keystore kafka.client.keystore.jks -alias CARoot
> -import
> > >> -file
> > >> > > > cert.pem
> > >> > > >
> > >> > > > I've a console producer pushing data in to the topic, and gives
> > >> error
> > >> > as
> > >> > > > shown below ->
> > >> > > >
> > >> > > >
> > >> > > > Caused by: javax.net.ssl.SSLProtocolException: Handshake
> message
> > >> > > sequence
> > >> > > > > violation, state = 1, type = 1
> > >> > > > > at
> > >> > > > >
> > >> > > > sun.security.ssl.ServerHandshaker.processMessage(
> > >> > > ServerHandshaker.java:213)
> > >> > > > > at sun.security.ssl.Handshaker.processLoop(Handshaker.java:
> > 1026)
> > >> > > > > at sun.security.ssl.Handshaker$1.run(Handshaker.java:966)
> > >> > > > > at sun.security.ssl.Handshaker$1.run(Handshaker.java:963)
> > >> > > > > at java.security.AccessController.doPrivileged(Native Method)
> > >> > > > > at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.
> > >> > java:1416)
> > >> > > > > at
> > >> > > > >
> > >> > > > org.apache.kafka.common.network.SslTransportLayer.runDelegat
> > >> edTasks(
> > >> > > SslTransportLayer.java:336)
> > >> > > > > at
> > >> > > > >
> > >> > > > org.apache.kafka.common.network.SslTransportLayer.
> > handshakeUnwrap(
> > >> > > SslTransportLayer.java:417)
> > >> > > > > ... 7 more
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > > Any ideas on what the issue might be ?
> > >> > > > thanks for help in advance!
> > >> > > >
> > >> > >
> > >> >
> > >>
> > >
> > >
> >
>

Reply via email to