diff --git a/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslBrokerServiceTest.java b/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslBrokerServiceTest.java new file mode 100644 index 0000000000..0072dfe99b --- /dev/null +++ b/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslBrokerServiceTest.java @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.activemq.transport.tcp; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.KeyStore; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; + +import junit.framework.Test; +import junit.textui.TestRunner; + +import org.apache.activemq.broker.BrokerService; +import org.apache.activemq.broker.SslBrokerService; +import org.apache.activemq.transport.TransportBrokerTestSupport; +import org.apache.activemq.transport.TransportFactory; + +public class SslBrokerServiceTest extends TransportBrokerTestSupport { + + protected String getBindLocation() { + return "ssl://localhost:0"; + } + + @Override + protected BrokerService createBroker() throws Exception { + SslBrokerService service = new SslBrokerService(); + service.setPersistent(false); + + KeyManager[] km = getKeyManager(); + TrustManager[] tm = getTrustManager(); + connector = service.addSslConnector(getBindLocation(), km, tm, null); + + // for client side + SslTransportFactory sslFactory = new SslTransportFactory(); + sslFactory.setKeyAndTrustManagers(km, tm, null); + TransportFactory.registerTransportFactory("ssl", sslFactory); + + return service; + } + + + private TrustManager[] getTrustManager() throws Exception { + TrustManager[] trustStoreManagers = null; + KeyStore trustedCertStore = KeyStore.getInstance(SslTransportBrokerTest.KEYSTORE_TYPE); + + trustedCertStore.load(new FileInputStream(SslTransportBrokerTest.TRUST_KEYSTORE), null); + TrustManagerFactory tmf = + TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + + tmf.init(trustedCertStore); + trustStoreManagers = tmf.getTrustManagers(); + return trustStoreManagers; + } + + private KeyManager[] getKeyManager() throws Exception { + KeyManagerFactory kmf = + KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + KeyStore ks = KeyStore.getInstance(SslTransportBrokerTest.KEYSTORE_TYPE); + KeyManager[] keystoreManagers = null; + + byte[] sslCert = loadClientCredential(SslTransportBrokerTest.SERVER_KEYSTORE); + + + if (sslCert != null && sslCert.length > 0) { + ByteArrayInputStream bin = new ByteArrayInputStream(sslCert); + ks.load(bin, SslTransportBrokerTest.PASSWORD.toCharArray()); + kmf.init(ks, SslTransportBrokerTest.PASSWORD.toCharArray()); + keystoreManagers = kmf.getKeyManagers(); + } + return keystoreManagers; + } + + private static byte[] loadClientCredential(String fileName) throws IOException { + if (fileName == null) { + return null; + } + FileInputStream in = new FileInputStream(fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[512]; + int i = in.read(buf); + while (i > 0) { + out.write(buf, 0, i); + i = in.read(buf); + } + in.close(); + return out.toByteArray(); + } + + protected void setUp() throws Exception { + maxWait = 10000; + super.setUp(); + } + + public static Test suite() { + return suite(SslBrokerServiceTest.class); + } + + public static void main(String[] args) { + TestRunner.run(suite()); + } +} diff --git a/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslTransportBrokerTest.java b/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslTransportBrokerTest.java index c7f087d164..c5a90fcad3 100755 --- a/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslTransportBrokerTest.java +++ b/activemq-core/src/test/java/org/apache/activemq/transport/tcp/SslTransportBrokerTest.java @@ -22,17 +22,22 @@ import org.apache.activemq.transport.TransportBrokerTestSupport; public class SslTransportBrokerTest extends TransportBrokerTestSupport { + public static final String KEYSTORE_TYPE = "jks"; + public static final String PASSWORD = "password"; + public static final String SERVER_KEYSTORE = "src/test/resources/server.keystore"; + public static final String TRUST_KEYSTORE = "src/test/resources/client.keystore"; + protected String getBindLocation() { return "ssl://localhost:0"; } protected void setUp() throws Exception { - System.setProperty("javax.net.ssl.trustStore", "src/test/resources/client.keystore"); - System.setProperty("javax.net.ssl.trustStorePassword", "password"); - System.setProperty("javax.net.ssl.trustStoreType", "jks"); - System.setProperty("javax.net.ssl.keyStore", "src/test/resources/server.keystore"); - System.setProperty("javax.net.ssl.keyStorePassword", "password"); - System.setProperty("javax.net.ssl.keyStoreType", "jks"); + System.setProperty("javax.net.ssl.trustStore", TRUST_KEYSTORE); + System.setProperty("javax.net.ssl.trustStorePassword", PASSWORD); + System.setProperty("javax.net.ssl.trustStoreType", KEYSTORE_TYPE); + System.setProperty("javax.net.ssl.keyStore", SERVER_KEYSTORE); + System.setProperty("javax.net.ssl.keyStorePassword", PASSWORD); + System.setProperty("javax.net.ssl.keyStoreType", KEYSTORE_TYPE); //System.setProperty("javax.net.debug", "ssl,handshake,data,trustmanager"); maxWait = 10000;