php小編新一今天為大家介紹的是Spring AMQP,它是一種基於AMQP協定的訊息傳遞框架。然而,有時在使用Spring AMQP時,我們可能會遇到一個錯誤:「未找到相容的身份驗證機制 - 提供伺服器」。這個錯誤提示可能會讓人感到困惑,不知道該如何解決。接下來,我們將詳細解釋這個錯誤的原因,並提供解決方案,幫助大家順利使用Spring AMQP框架。
我正在嘗試透過外部驗證機制將spring boot 應用程式連接到rabbit mq (https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl) 。
我收到以下錯誤:
org.springframework.amqp.amqpioexception: java.io.ioexception: no compatible authentication mechanism found - server offered [] at org.springframework.amqp.rabbit.support.rabbitexceptiontranslator.convertrabbitaccessexception(rabbitexceptiontranslator.java:70) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.connection.abstractconnectionfactory.createbareconnection(abstractconnectionfactory.java:594) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.connection.cachingconnectionfactory.createconnection(cachingconnectionfactory.java:687) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.connection.connectionfactoryutils.createconnection(connectionfactoryutils.java:257) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.core.rabbittemplate.doexecute(rabbittemplate.java:2225) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.core.rabbittemplate.execute(rabbittemplate.java:2198) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.core.rabbittemplate.execute(rabbittemplate.java:2178) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.core.rabbitadmin.getqueueinfo(rabbitadmin.java:459) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.core.rabbitadmin.getqueueproperties(rabbitadmin.java:443) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.listener.abstractmessagelistenercontainer.attemptdeclarations(abstractmessagelistenercontainer.java:1891) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.listener.abstractmessagelistenercontainer.redeclareelementsifnecessary(abstractmessagelistenercontainer.java:1858) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer$asyncmessageprocessingconsumer.initialize(simplemessagelistenercontainer.java:1384) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer$asyncmessageprocessingconsumer.run(simplemessagelistenercontainer.java:1230) ~[spring-rabbit-3.0.5.jar:3.0.5] at java.base/java.lang.thread.run(thread.java:833) ~[na:na] caused by: java.io.ioexception: no compatible authentication mechanism found - server offered [] at com.rabbitmq.client.impl.amqconnection.start(amqconnection.java:343) ~[amqp-client-5.17.0.jar:5.17.0] at com.rabbitmq.client.connectionfactory.newconnection(connectionfactory.java:1225) ~[amqp-client-5.17.0.jar:5.17.0] at com.rabbitmq.client.connectionfactory.newconnection(connectionfactory.java:1173) ~[amqp-client-5.17.0.jar:5.17.0] at org.springframework.amqp.rabbit.connection.abstractconnectionfactory.connectaddresses(abstractconnectionfactory.java:632) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.connection.abstractconnectionfactory.connect(abstractconnectionfactory.java:607) ~[spring-rabbit-3.0.5.jar:3.0.5] at org.springframework.amqp.rabbit.connection.abstractconnectionfactory.createbareconnection(abstractconnectionfactory.java:557) ~[spring-rabbit-3.0.5.jar:3.0.5] ... 12 common frames omitted
依賴關係:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-amqp</artifactid> <version>3.2.1</version> </dependency>
rabbitmq版本:rabbitmq:3.12.1-management
rabbitmq.conf 包含這些屬性:
default_user=guest default_pass=guest listeners.tcp=none listeners.ssl.default=5672 ssl_options.cacertfile=/etc/rabbitmq/cert/ca_bundle.pem ssl_options.certfile=/etc/rabbitmq/cert/certificate.pem ssl_options.keyfile=/etc/rabbitmq/cert/key.pem ssl_options.password=pass ssl_options.verify=verify_peer ssl_options.fail_if_no_peer_cert=true ssl_options.versions.1=tlsv1.2 ssl_options.depth=1 auth_mechanisms.1=external ssl_cert_login_from=common_name
應用程式屬性:
spring.rabbitmq.ssl.enabled=true spring.rabbitmq.ssl.algorithm=tlsv1.2 spring.rabbitmq.ssl.key-store=keystore.p12 spring.rabbitmq.ssl.key-store-password=pass spring.rabbitmq.ssl.key-store-type=pkcs12 spring.rabbitmq.ssl.trust-store=truststore.p12 spring.rabbitmq.ssl.trust-store-password=pass spring.rabbitmq.ssl.trust-store-type=pkcs12
我宣告了以下方法來包含 sasl 設定:
@Bean public AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory) { CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory) connectionFactory; cachingConnectionFactory.getRabbitConnectionFactory().setAutomaticRecoveryEnabled(true); cachingConnectionFactory.getRabbitConnectionFactory().setSaslConfig(DefaultSaslConfig.EXTERNAL); cachingConnectionFactory.resetConnection(); RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory); rabbitTemplate.setMessageConverter(converter()); return rabbitTemplate; }
我不確定rabbitmq 配置端的listeners.ssl.default=5672
是什麼,但聽起來您將預設的ssl 連接埠覆蓋到該端口。
spring boot中的邏輯是這樣的:
return (optional.ofnullable(getssl().getenabled()).orelse(false)) ? default_port_secure : default_port;
地點:
private static final int default_port_secure = 5671;
因此,可能需要考慮明確提供該連接埠:
spring.rabbitmq.port=5672
您可能也不需要自訂rabbittemplate
bean,只需新增connectionfactorycustomizer
即可將defaultsaslconfig.external
設定為自動配置的com .rabbitmq.client.connectionfactory
。
也不建議使用 setautomaticrecoveryenabled(true)
: https://www.php.cn/link/3c0de3fec9ab8a3df01109251f137119
以上是Spring amqp - 未找到相容的身份驗證機制 - 提供伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!