首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qpid与AMQP1.0代理通过SSL进行通信

使用Qpid与AMQP1.0代理通过SSL进行通信
EN

Stack Overflow用户
提问于 2013-10-03 16:29:48
回答 3查看 4.9K关注 0票数 2

我使用的是ActiveMQ 5.8.0,它支持AMQP1.0作为队列代理。我试图使用Qpid AMQP1.0客户端jms库与Java客户机进行通信,但没有看到指定keystore和信任存储信息的方法。

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

我目前正在使用createFromURL方法从包含这里参数的URL中生成连接,但密钥存储信息(以及潜在的故障转移参数)似乎没有从这里解析。

代码语言:javascript
复制
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); 

有没有人知道向连接提供安全信息的更好方法?

更新:是对的,所以我已经确定库使用的是默认的SSLSocketFactory。

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

代码语言:javascript
复制
final Socket s;
if(ssl)
{
    s = SSLSocketFactory.getDefault().createSocket(address, port);
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-03 16:50:39

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

票数 0
EN

Stack Overflow用户

发布于 2014-10-22 13:45:42

QPID JMSAMQP1.0客户端的连接URL参数与前一个AMQP版本的参数略有不同。

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

代码语言:javascript
复制
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

另见此链接

票数 3
EN

Stack Overflow用户

发布于 2016-07-01 00:01:24

对于支持AMQP1.0.0版本的QPid的0.9.0版本,QPID客户端配置页面还可以帮助以编程的方式完成这项工作。

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

代码语言:javascript
复制
    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();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19164431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档