我正试图找到有关如何让它工作的示例代码。无需在客户端指定任何证书。有没有人有如何执行此操作的示例?
我在网上找到的所有示例都使用 SSL/TLS 进行身份验证和传输安全。
最佳答案
是的。
您需要在 rabbitmq.conf 中添加 auth_mechanisms = PLAIN 或 AMQPPLAIN
在服务端和客户端配置证书。
不需要使用rabbitmq_auth_mechanism_ssl
插件
使用 Java,您需要创建一个 KeyStore
、KeyManagerFactory
和 TrustManagerFactory
,并发送您的证书。
使用 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/