Camel-rabbitmq组件无法通过SSL与RabbitMQ建立连接
解决Camel-RabbitMQ SSL连接失败(EOFException)的问题
从你的配置和错误日志来看,核心问题是自定义的ConnectionFactory没有启用SSL配置,同时Camel的RabbitMQ端点也没有关联这个自定义Factory,导致客户端尝试用明文连接RabbitMQ的SSL端口(5671),最终被服务端断开连接,抛出EOFException。
问题分析
你定义了customConnectionFactory但没有设置任何SSL相关属性,而Camel的RabbitMQ组件在你指定sslProtocol时,如果没有显式关联自定义Factory,它会创建自己的默认Factory;但你这里的自定义Factory是明文配置,即使uri里加了sslProtocol,也会因为实际使用的Factory不支持SSL而失败。日志里的EOFException就是典型的明文客户端连接SSL端口的表现——服务端收到非SSL流量后直接关闭连接,导致输入流提前结束。
修正后的Blueprint配置
你需要做两个关键修改:给自定义ConnectionFactory添加SSL配置,并且在Camel uri里关联这个Factory:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <!-- 配置带SSL的ConnectionFactory --> <bean id="customConnectionFactory" class="com.rabbitmq.client.ConnectionFactory"> <property name="host" value="127.0.0.1"/> <property name="port" value="5671"/> <property name="username" value="admin"/> <property name="password" value="admin"/> <!-- 启用TLSv1.2协议,和Camel uri保持一致 --> <property name="sslProtocol" value="TLSv1.2"/> <!-- 如果你需要自定义信任库(而非依赖JVM默认的cacerts),可以添加以下配置: <property name="trustStore" value="/path/to/your/truststore.jks"/> <property name="trustStorePassword" value="your-truststore-password"/> --> </bean> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <!-- 显式关联自定义的ConnectionFactory,同时保留sslProtocol配置 --> <from uri="rabbitmq://rmqEx?queue=queue&routingKey=rmqRoutekey&sslProtocol=TLSv1.2&connectionFactory=#customConnectionFactory"/> <to uri="log:msgdestroy"/> </route> </camelContext> </blueprint>
额外验证步骤
- 确认JVM信任库配置:如果你依赖JVM默认的
cacerts,确保RabbitMQ的服务器证书已经导入其中;如果用自定义信任库,检查JVM参数是否正确设置:-Djavax.net.ssl.trustStore=/path/to/truststore.jks -Djavax.net.ssl.trustStorePassword=your-password - 检查RabbitMQ SSL配置:确认RabbitMQ的
rabbitmq.conf里已经启用SSL监听,并且证书链完整有效,比如:listeners.ssl.default = 5671 ssl_options.cacertfile = /path/to/ca_certificate.pem ssl_options.certfile = /path/to/server_certificate.pem ssl_options.keyfile = /path/to/server_private_key.pem
内容的提问来源于stack exchange,提问作者Peter Jerald
相关产品推荐
相关产品推荐

