首页 > 解决方案 > 如何在java中使用apache qpid库和动态证书字符串(而不是证书路径)创建amqp连接

问题描述

当前通过覆盖 JmsConnectionFactory(qpid apache) application-context.xml 的 setRemoteURI("") 创建 amqp 连接

<bean id="amqpConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory">
        <bean class="com.abc.AMQPSConnectionFactory">
        </bean>
    </property>
</bean>
    
    
<bean id="amqp" class="org.apache.camel.component.amqp.AMQPComponent">
    <property name="testConnectionOnStartup" value="true" />
    <property name="configuration" ref="amqpConfig" />
</bean>

我的 AMQPSConnectionFactory - 目前正在通过覆盖 JmsConnectionFactory 的 setRemoteURI("") 来创建具有给定 KEYSTORELOCATION、KEYSTOREPASSWORD、KEYSTORETYPE 的 amqp 连接,如图所示

public class AMQPSConnectionFactory extends JmsConnectionFactory {
       public AMQPSConnectionFactory() {
        setRemoteURI("URL?jms.prefetchPolicy.queuePrefetch=true&transport.keyStoreLocation=KEYSTORELOC&transport.keyStorePassword=KEYSTOREPASSWORD&transport.keyStoreType=KEYSTORETYPE&transport.trustAll=true&transport.enabledProtocols=TLSv1.2");
    }
}

如何通过在运行时传递 base 64 编码的 CERTIFICATE 字符串(而不是 KEYSTORELOCATION)、该证书的 base 64 编码的密码(而不是 KEYSTOREPASSWORD)和 KEYSTORETYPE 来创建 amqp 连接?

问题:我无法将证书保留在路径中(在 uri 中提供 KEYSTORELOCATION),但需要使用证书字符串本身

标签: javassldynamicamqpqpid

解决方案


与您所要求的最接近的匹配项是 SSLContext 覆盖,它允许您提供自己的 SSLContext,客户端将在 SSL 握手期间使用。没有直接向连接工厂提供证书的机制,我怀疑是否会添加任何此类机制。

 JmsConnectionFactory factory = new JmsConnectionFactory("amqps://localhost:5673");
 factory.setSslContext(<your-own-context>);

推荐阅读