2

AMQP 1.0 をキュー ブローカーとしてサポートする ActiveMQ 5.8.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 を掘り下げると、ライブラリがデフォルトの 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

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 に答える