【发布时间】:2017-01-16 06:55:36
【问题描述】:
我正在尝试查找有关如何使其工作的示例代码。无需在客户端指定任何证书。有没有人有如何做到这一点的例子?
我在网上找到的所有示例都使用 SSL/TLS 进行身份验证以及传输安全性。
【问题讨论】:
我正在尝试查找有关如何使其工作的示例代码。无需在客户端指定任何证书。有没有人有如何做到这一点的例子?
我在网上找到的所有示例都使用 SSL/TLS 进行身份验证以及传输安全性。
【问题讨论】:
是的。
你需要在 rabbitmq.conf 中添加一个auth_mechanisms = PLAIN or 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 数据包。
【讨论】:
按照官网文档: https://www.rabbitmq.com/ssl.html
您可以找到有和没有客户端配置的配置。
【讨论】: