Maison  >  Article  >  Spring amqp - Aucun mécanisme d'authentification compatible trouvé - serveur fournissant

Spring amqp - Aucun mécanisme d'authentification compatible trouvé - serveur fournissant

PHPz
PHPzavant
2024-02-14 08:50:091198parcourir

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.

Contenu de la question

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;
  }

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer