ssl - 使用 SSL/TLS 的 RabbitMQ 普通身份验证

标签 ssl rabbitmq

我正试图找到有关如何让它工作的示例代码。无需在客户端指定任何证书。有没有人有如何执行此操作的示例?

我在网上找到的所有示例都使用 SSL/TLS 进行身份验证和传输安全。

最佳答案

是的。
您需要在 rabbitmq.conf 中添加 auth_mechanisms = PLAIN 或 AMQPPLAIN
在服务端和客户端配置证书。

不需要使用rabbitmq_auth_mechanism_ssl插件

使用 Java,您需要创建一个 KeyStoreKeyManagerFactoryTrustManagerFactory,并发送您的证书。
使用 Python,您需要使用 ssl 包并创建上下文并加载证书链并将您的证书发送到服务器。

按照文档配置 ssl 后,使用 Java 创建工厂,并设置用户和密码。使用 Python 创建一个 PlainCredentials。

在 Python 中是这样的:

import pika
import sys
import ssl

context = ssl.create_default_context(cafile="/home/userx/rabbitmq/certs/testca/ca.crt")
context.load_cert_chain("/home/userx/rabbitmq/certs/client/client_certificate.pem", "/home/userx/rabbitmq/certs/client/private_key.pem")
ssl_options = pika.SSLOptions(context, server_hostname="xrabbit")
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('/home/userx/rabbitmq/certs/testca/ca.crt')
credentials = pika.PlainCredentials('user1', 'password%!xyz$328')
parameters = pika.ConnectionParameters('xrabbit',5671,'/',credentials, ssl_options=ssl_options)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

在 Java 中是这样的:

KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream("/home/userx/rabbitmq/certs/client_keystore.pkcs12"), keyPassphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keyPassphrase);
char[] trustPassphrase = "rabbit".toCharArray();
KeyStore tks = KeyStore.getInstance("PKCS12");
tks.load(new FileInputStream("/home/userx/rabbitmq/certs/trust_store"), trustPassphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");tmf.init(tks);
SSLContext c = SSLContext.getInstance("TLSv1.3");
c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("xrabbit");
factory.setPort(5671);
factory.setUsername("user1");
factory.setPassword("password$321xk!!44");
factory.setSaslConfig(DefaultSaslConfig.PLAIN);
factory.useSslProtocol(c);
factory.enableHostnameVerification();
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();

最后,使用 Wireshark 检查连接,应该只出现 TLS 数据包,如果您的客户端连接仅使用纯文本,将出现来自服务器的 TLS 数据包,但您的客户端将发送 AMQP 数据包,如果您的服务器和客户端是使用 TLS,您只会看到 TLS 数据包。

关于ssl - 使用 SSL/TLS 的 RabbitMQ 普通身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41670944/

相关文章:

java - 为什么 SpEL 在 Spring Boot 和 Spring Cloud Stream @SendTo 中不起作用

c++ - 如何从 rabbitmq - amqpcpp 库中的消息中读取 reply_to?

java - 在 Spring Boot 上动态设置 Spring AMQP 和 RabbitMQ 的主机

使用 SSL 的 Apache 名称虚拟主机

iOS MDM : Code:20 (Unable to get local issuer certificate)

ssl - 查询-关于-Gnutls-构建

django - 在 Celery 中为长时间运行的任务实现 "idle"和 "normal"优先级队列

erlang - 如何在 RabbitMQ 的 Erlang 客户端中使用消息头?

ssl - 如何解决 "error:1408F10B:SSL routines:ssl3_get_record:wrong version number"?

ssl - 支付网关 HTTP 错误 : cURL ERROR: 51: SSL: certificate subject name 'seguro3.cpmp.com.gt' does not match target host name '190.0.195.24'