L'éditeur php Xinyi vous présente aujourd'hui Spring AMQP, qui est un framework de messagerie basé sur le protocole AMQP. Cependant, parfois lors de l'utilisation de Spring AMQP, nous pouvons rencontrer une erreur : "Aucun mécanisme d'authentification compatible trouvé - serveur fournissant". Ce message d'erreur peut prêter à confusion et vous ne savez pas comment le résoudre. Ensuite, nous expliquerons en détail la cause de cette erreur et fournirons des solutions pour aider tout le monde à utiliser le framework Spring AMQP en douceur.
J'essaie de connecter une application Spring Boot à Rabbit MQ (https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl) via un mécanisme d'authentification externe.
J'obtiens l'erreur suivante :
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
Dépendances :
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-amqp</artifactid> <version>3.2.1</version> </dependency>
version lapinmq : lapinmq:3.12.1-gestion
rabbitmq.conf contient ces propriétés :
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
Propriétés de l'application :
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
J'ai déclaré la méthode suivante pour inclure la configuration 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; }
Je ne suis pas sûr de ce qu'est le listeners.ssl.default=5672
du côté de la configuration de Rabbitmq, mais il semble que vous remplacez le port SSL par défaut par cela.
La logique de Spring Boot est la suivante :
return (optional.ofnullable(getssl().getenabled()).orelse(false)) ? default_port_secure : default_port;
Emplacement :
private static final int default_port_secure = 5671;
Vous pourriez donc envisager de fournir le port explicitement :
spring.rabbitmq.port=5672
Vous n’avez probablement pas besoin de personnaliser non plus rabbittemplate
bean,只需添加 connectionfactorycustomizer
即可将 defaultsaslconfig.external
设置为自动配置的 com.rabbitmq.client.connectionfactory
.
Il n'est pas recommandé d'utiliser setautomaticrecoveryenabled(true)
: https://www.php.cn/link/3c0de3fec9ab8a3df01109251f137119
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!