【问题标题】:RabbitMQ plain authentication with SSL/TLS使用 SSL/TLS 的 RabbitMQ 普通身份验证
【发布时间】:2017-01-16 06:55:36
【问题描述】:

我正在尝试查找有关如何使其工作的示例代码。无需在客户端指定任何证书。有没有人有如何做到这一点的例子?

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

【问题讨论】:

    标签: ssl rabbitmq


    【解决方案1】:

    是的。
    你需要在 rabbitmq.conf 中添加一个auth_mechanisms = PLAIN or 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 数据包。

    【讨论】:

      【解决方案2】:

      按照官网文档: https://www.rabbitmq.com/ssl.html

      您可以找到有和没有客户端配置的配置。

      【讨论】:

        猜你喜欢
        • 2020-09-05
        • 2022-08-23
        • 2015-06-20
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多