2

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

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

我目前正在使用 createFromURL 方法从包含此处定义的 SSL 参数的 URL 生成连接,但似乎没有从 URL 解析密钥库信息(以及可能的故障转移参数)。

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 进行了一些挖掘,我发现该库使用 Default SSLSocketFactory

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

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

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

4

3 回答 3

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

另请参阅此链接

于 2014-10-22T13:45:42.603 回答
0

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

于 2013-10-03T16:50:39.810 回答
0

对于支持 AMQP 1.0.0 版的 QPid 0.9.0 版,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();
    }
于 2016-07-01T00:01:24.267 回答