Which side is complaining about the bad certificate?  Client or server?  I
assume the server is complaining about the client's cert, since it works
when NeedClientAuth=false.  Is that right?

Also, does the client's cert's CN match its hostname?

Also, this StackOverflow page (
http://stackoverflow.com/questions/11799733/received-fatal-alert-bad-certificate)
suggests you need the root CA in the truststores as well; I wouldn't have
expected that (if the cert itself is trusted, I don't know why the root CA
has to be as well), but you might give that a shot to see if it resolves
your issue.

Tim

On Wed, Apr 15, 2015 at 1:41 AM, RTactivemq <what2...@yahoo.com> wrote:

> Hello, I've searched the forums, google sites, and of course ActiveMQ's
> website for an answer but I am unable to find one.
>
> I will start off by giving some basic information about my setup.
>
> First, my activemq broker is running out of a JBoss AM-Q system with
> versions:
>
> server version: Apache activemq 5.9.0.redhat-611416 running on java 1.7
>
> My client is Windows 7 java project running out of Eclipse Luna using java
> jdk 1.7.
>
> My api I'm using is the org.apache.qpid.amqp_1_0.jms and some of the
> javax.jms libraries.
>
> My objective is fairly simple, take the examples given in the activemq
> release running out of an eclipse project and add 2 way authentication
> functionality.
>
> Actions Taken:
>
> I will start off by saying I fully read the How do I use SSL page on
> apache's website.  Getting 1 way authentication worked and I can send and
> receive messages just fine. Two way authentication is proving most
> difficult.
>
> On the broker, I have a keystore and truststore already provided.  Also, I
> have been provided with a certificate for that machine that matches the md5
> found in the keystore.jks.  So I know that the certificate matches the
> keystore.
>
> On the client machine I created a keystore first.  I ran the command in
> Cygwin, "$JAVA_HOME/bin/keytool" -genkey -alias client -keyalg RSA
> -keystore
> client.ks.  This created the ks file, to which I exported from that
> client.ks file, a certificate.
>
> I took the broker's certificate and imported it into a truststore on the
> client machine.  Like above, I used my Java keytool, with options -import
> -alias eap6 -keystore client.ts -file <provided broker cert>.  On the
> broker
> machine, I did the same thing.  I went into the truststore and imported the
> client_cert, using the alias client.
>
> Development:
>
> As stated I started off with the examples provided by ActiveMQ in the
> examples directory for establishing a connection between client and broker
> using the amqp protocol.
>
> So my send message looks like this:
>
> I set host, port, and clientid and pass those to a constructor that uses
> the
> code below.  I then attempt to create a connection . One way ssl works
> without the authentication so leaving the user and password blank I assume
> is fine?
>
> try{
>             ConnectionFactoryImpl factory = new ConnectionFactoryImpl(uri,
> port, "", "", client, true);
>             connection=factory.createConnection("","");
>             connection.start();
>             session = connection.createSession(false,
> Session.AUTO_ACKNOWLEDGE);
>         } catch (Exception e){
>             LOGGER.log(Level.SEVERE, "Exception caught:", e);
>         }
>
> I then have a send method. Destination looks like this: private Destination
> destination=new QueueImpl("queue://amqp-ssl-q");
>
> try{
>             MessageProducer producer=session.createProducer(destination);
>             LOGGER.info( " [x] Creating message" );
>
>             TextMessage msg = session.createTextMessage("Hello World!");
>             producer.send(msg);
>             LOGGER.info( " [x] Sent Message");
>         } catch (JMSException e){
>             LOGGER.log(Level.SEVERE, "[X] Send Failed:", e);
>         }
>
> Configuration:
>
> I know the server and client need ways of getting the keystore and client.
> On the broker, I use the activemq.xml to set this:
>
>  <sslContext>
>               <sslContext
>                   keyStore="/security/ssl/keystore/keystore.jks"
>                  keyStorePassword="%{keystore.password}"
>                  trustStore="/security/ssl/truststore/truststore.jks"
>                  trustStorePassword="%{truststore.password}"
>                  />
> </sslContext>
>
> I setup the transport connector as such:
>
> <transportConnector name="amqp+ssl"
> uri="amqp+ssl://0.0.0.0:5671?transport.needClientAuth=true"/>
>
>
> In eclipse I went into the Run Configurations and under arguments -> vm
> arguments, I set the path to my truststore and keystore like so:
>
> -Djavax.net.ssl.keyStore=C:/<path>/<to>/<keystore>/client.ks
> -Djavax.net.ssl.keyStorePassword="<password>"
> -Djavax.net.ssl.trustStore=C:/<path>/<to>/<truststore>/client.ts
> -Djavax.net.ssl.trustStorePassword="<password>"
> -Djavax.net.debug=ssl
>
> The following parameters I added because the debugger in eclipse had null
> for these values. Before I used them I was just using the ones above. It
> didn't seem to add a difference.  But I was desperate so I added these to
> the vm arguments. I should also note that I also tried adding just the path
> to the property but not including the file, like the keystore below. So I
> tried running the send with parameters below missing the file at the end
> and
> then with the file.
> -Djavax.net.ssl.trustStorePath=C:/<path>/<to>/<trustStore>/client.ts
> -Djavax.net.ssl.keyStorePath=C:/<path>/<to>/<keystore>
>
> Error:
>
> When I run this, it complains about a bad certificate.
> main, WRITE: TLSv1 Handshake, length = 48
> main, READ: TLSv1 Alert, length = 2
> main, RECV TLSv1 ALERT:  fatal, bad_certificate
> %% Invalidated:  [Session-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]
> main, called closeSocket()
> main, handling exception: javax.net.ssl.SSLHandshakeException: Received
> fatal alert: bad_certificate
>
> javax.jms.JMSException: javax.net.ssl.SSLHandshakeException: Received fatal
> alert: bad_certificate
>         at
>
> org.apache.qpid.amqp_1_0.jms.impl.ConnectionImpl.connect(ConnectionImpl.java:193)
>         at
>
> org.apache.qpid.amqp_1_0.jms.impl.ConnectionImpl.start(ConnectionImpl.java:365)
>
> Caused by: org.apache.qpid.amqp_1_0.client.ConnectionException:
> javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
>         at
>
> org.apache.qpid.amqp_1_0.client.TCPTransportProvider.connect(TCPTransportProvider.java:203)
>         at
> org.apache.qpid.amqp_1_0.client.Connection.<init>(Connection.java:278)
>         at
> org.apache.qpid.amqp_1_0.client.Connection.<init>(Connection.java:167)
>         at
>
> org.apache.qpid.amqp_1_0.jms.impl.ConnectionImpl.connect(ConnectionImpl.java:173)
>         ... 3 more
>
> Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert:
> bad_certificate
>         at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
>         at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
>         at
> sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
>         at
> sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
>         at
>
> sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
>         at
> sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
>         at
> sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
>         at
>
> org.apache.qpid.amqp_1_0.client.TCPTransportProvider.connect(TCPTransportProvider.java:106)
>         ... 6 more
>
> Questions:
>
> Does this seem like I am doing something incorrectly?  I really don't
> understand where I have made a mistake.  The instructions are fairly
> straightforward in setting up the keystore and truststore in the How do I
> use SSL page.  Also, I don't think I'm doing anything radical here with the
> client side code, as I am basing it off the provided activemq release
> examples.  One way also works fine, so it is pulling the broker's
> certificate just fine when I set the NeedClientAuth=false.
>
> If anyone has ideas, I would be happy to try them.  Also, if more
> information is needed I will do what I can to provide it.
>
>
>
> --
> View this message in context:
> http://activemq.2283324.n4.nabble.com/ActiveMQ-2-Way-Authentication-tp4694960.html
> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>

Reply via email to