Java 8环境下Spring Cloud Bus配置RabbitMQ SSL连接求助
解决Spring Boot + Spring Cloud Bus 与RabbitMQ的SSL加密连接配置问题
刚好处理过类似的Spring Boot + Spring Cloud Bus对接RabbitMQ SSL的场景,结合你提到的版本(Spring Boot 1.5.9.RELEASE、Spring Cloud Bus 1.3.1.RELEASE)以及之前遇到的SSL握手失败问题,给你整理一套完整的配置步骤,亲测有效:
一、先搞定RabbitMQ服务器端的SSL配置
这一步是基础,服务器没配置好,客户端再怎么调都白搭:
- 先启用RabbitMQ的SSL插件,执行命令:
rabbitmq-plugins enable rabbitmq_ssl - 找到RabbitMQ的配置文件(通常是
/etc/rabbitmq/rabbitmq.config,新版本可能是rabbitmq.conf),添加SSL监听和证书配置。如果是erlang格式的配置文件,这么写:[{rabbit, [ {ssl_listeners, [5671]}, # SSL默认监听端口 {ssl_options, [ {cacertfile, "/绝对路径/ca_cert.pem"}, # CA根证书 {certfile, "/绝对路径/server_cert.pem"}, # 服务器证书 {keyfile, "/绝对路径/server_key.pem"}, # 服务器私钥 {verify, verify_peer}, # 是否验证客户端证书,不需要的话设为verify_none {fail_if_no_peer_cert, false} # 没有客户端证书时是否拒绝连接,双向认证才设为true ]} ]}]. - 配置完记得重启RabbitMQ服务:
sudo service rabbitmq-server restart
二、Spring Boot客户端(Spring Cloud Bus)配置
在你的应用配置文件(application.properties或application.yml)里添加SSL相关配置,替换成你的实际信息:
用properties的话:
# 基础RabbitMQ配置 spring.rabbitmq.host=你的RabbitMQ服务器IP/域名 spring.rabbitmq.port=5671 # 对应服务器的SSL监听端口 spring.rabbitmq.username=你的RabbitMQ账号 spring.rabbitmq.password=你的RabbitMQ密码 # 开启SSL spring.rabbitmq.ssl.enabled=true # 信任库配置:里面要导入RabbitMQ服务器的CA证书,确保能验证服务器身份 spring.rabbitmq.ssl.trust-store=/绝对路径/client_truststore.jks spring.rabbitmq.ssl.trust-store-password=你的信任库密码 spring.rabbitmq.ssl.trust-store-type=JKS # 如果需要双向认证(服务器也要验证客户端证书),再加上下面这几行 # spring.rabbitmq.ssl.key-store=/绝对路径/client_keystore.jks # spring.rabbitmq.ssl.key-store-password=你的密钥库密码 # spring.rabbitmq.ssl.key-store-type=JKS
用yml的话:
spring: rabbitmq: host: 你的RabbitMQ服务器IP/域名 port: 5671 username: 你的RabbitMQ账号 password: 你的RabbitMQ密码 ssl: enabled: true trust-store: /绝对路径/client_truststore.jks trust-store-password: 你的信任库密码 trust-store-type: JKS # 双向认证额外配置 # key-store: /绝对路径/client_keystore.jks # key-store-password: 你的密钥库密码 # key-store-type: JKS
三、优化你的客户端启动命令
你原来的启动命令里-Dhttps.protocols=TLSv1不太合适,TLSv1太老了,建议换成更安全的TLSv1.2(大部分RabbitMQ版本都支持),同时调试参数可以缩窄到SSL相关,避免日志太杂:
sudo java -Djavax.net.debug=ssl -Djdk.tls.client.protocols=TLSv1.2 -jar 你的应用jar包名.jar
解释下:
-Djavax.net.debug=ssl只输出SSL相关的调试日志,比all清爽多了,方便定位握手失败的具体原因-Djdk.tls.client.protocols=TLSv1.2强制客户端使用TLSv1.2协议,和服务器保持版本一致,避免因为协议不兼容导致握手失败
四、踩过的坑:握手失败排查要点
如果还是遇到握手失败,先检查这几个地方:
- 证书路径绝对不能错,而且要确保应用进程有读取证书文件的权限(比如用
chmod给证书文件加读权限) - 服务器和客户端的TLS版本必须匹配,比如服务器禁用了TLSv1,客户端就不能指定这个版本
- 信任库一定要包含RabbitMQ服务器的CA证书,否则客户端会认为服务器证书不合法
- 双向认证的话,还要把客户端证书导入RabbitMQ的信任库,不然服务器会拒绝客户端连接
内容的提问来源于stack exchange,提问作者turbocoder
相关产品推荐
相关产品推荐

