我使用的是ActiveMQ 5.8.0,它支持AMQP1.0作为队列代理。我试图使用Qpid AMQP1.0客户端jms库与Java客户机进行通信,但没有看到指定keystore和信任存储信息的方法。
我通过Java选项(例如-Djavax.net.ssl.keyStore)传递SSL凭据,成功地配置了一个客户端,但是对于我的最终解决方案来说,这是一个不可接受的方法.我需要能够从代码中指定这些信息。
我目前正在使用createFromURL方法从包含这里参数的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); 有没有人知道向连接提供安全信息的更好方法?
更新:是对的,所以我已经确定库使用的是默认的SSLSocketFactory。
请参阅: org.apache.qpid.amqp_1_0.client.Connection
final Socket s;
if(ssl)
{
s = SSLSocketFactory.getDefault().createSocket(address, port);
}因此,似乎无法在JVM选项之外指定此信息来设置默认值.至少在当前版本的Qpid客户端库中。
发布于 2013-10-03 16:50:39
URL是放置SSL参数的正确位置吗?ConnectionFactory不应该得到一个javax.net.ssl.SSLContext然后创建连接吗?(我不熟悉ActiveMQ API的细节。)
发布于 2014-10-22 13:45:42
QPID JMSAMQP1.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另见此链接
发布于 2016-07-01 00:01:24
对于支持AMQP1.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();
}https://stackoverflow.com/questions/19164431
复制相似问题