使用Qpid通过SSL与AMQP 1.0代理进行通信

时间:2013-10-03 16:29:48

标签: java ssl activemq qpid

我正在使用ActiveMQ 5.8.0,它支持AMQP 1.0作为队列代理。我正在尝试使用Qpid AMQP1.0客户端jms库从Java客户端与此进行通信,但是没有看到指定密钥库和信任库信息的方法。

我已经通过Java VM选项(例如-Djavax.net.ssl.keyStore)传递SSL凭据成功配置了客户端,但是这不是我最终解决方案的可接受方法...我需要成为能够在代码中指定此信息。

我目前正在使用createFromURL方法从包含已定义的here的SSL参数的URL生成连接,但是密钥库信息(以及可能的故障转移参数)似乎不会从URL中解析。< / p>

String connectionUrl = "amqps://localhost/?brokerlist='tcp://localhost:5671?ssl='true'&key_store='C:/apache-activemq-5.8.0/conf/client.ks'&key_store_password='password'&trust_store='C:/apache-activemq-5.8.0/conf/client.ts'&trust_store_password='password'";
ConnectionFactoryImpl connectionFactory = ConnectionFactoryImpl.createFromURL(connectionUrl); 

有谁知道更好的方法将安全信息提供给连接?

更新 是的,所以通过API进行一些挖掘,我发现该库使用了默认的SSLSocketFactory

请参阅:org.apache.qpid.amqp_1_0.client.Connection

final Socket s;
if(ssl)
{
    s = SSLSocketFactory.getDefault().createSocket(address, port);
}

因此,似乎没有办法在JVM选项之外指定此信息来设置默认值...至少在当前版本的Qpid客户端库中。

3 个答案:

答案 0 :(得分:3)

QPID JMS AMQP 1.0客户端的连接URL参数与先前AMQP版本的参数略有不同。

以下是适用于1.0客户端的连接URL的示例:

amqp://myhost:myport?ssl=true&ssl-cert-alias=myalias&clientid=myclientid&remote-host=default&sync-publish=false&trust-store=C:/trusstore.ts&trust-store-password=mytrustkeypass&key-store=C:/keystore.ks&key-store-password=mykeypass

另见this link

答案 1 :(得分:0)

网址是否是放置SSL参数的正确位置? ConnectionFactory是否应该获得javax.net.ssl.SSLContext然后创建连接? (我不熟悉ActiveMQ API的细节。)

答案 2 :(得分:0)

对于支持AMQP版本1.0.0的QPid 0.9.0版本,client configuration page at QPID也可以帮助您以编程方式执行此操作。

我还提供了一个成功程序的示例代码(注意:config是我创建的一个存储我所有配置值的类):

    String ampqProtocol = "amqp";
    List<String> queryVariables = new ArrayList<String>();

    if(config.isUseSSL()) {
        queryVariables.add("transport.keyStoreLocation="+config.getKeyStorePath());
        queryVariables.add("transport.keyStorePassword="+config.getKeyStorePassword());
        queryVariables.add("transport.trustStoreLocation="+config.getTrustStorePath());
        queryVariables.add("transport.trustStorePassword="+config.getTrustStorePassword());
        queryVariables.add("transport.keyAlias="+config.getKeyStoreAlias());
        queryVariables.add("transport.contextProtocol="+config.getSslProtocol());
        queryVariables.add("transport.verifyHost="+!config.isDontValidateSSLHostname());
        ampqProtocol = "amqps";
    }
    String connectionString = ampqProtocol+"://"+config.getAddress()+":"+config.getPort();
    if(!queryVariables.isEmpty()) {
        try {
            connectionString += "?"+URLEncoder.encode(StringUtils.join(queryVariables, "&"), StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    Hashtable<Object, Object> env = new Hashtable<Object, Object>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory");
    env.put("connectionfactory.myFactoryLookup", connectionString);

    Context context = null;
    ConnectionFactory connectionFactory = null;
    try {
        context = new InitialContext(env);
        connectionFactory = (ConnectionFactory) context.lookup("myFactoryLookup");
    } catch (NamingException e) {
        e.printStackTrace();
    }

    Connection connection = null;
    try {
        connection = connectionFactory.createConnection();
        connection.start();
    } catch (JMSException e) {
        e.printStackTrace();
    }