Python stompest无法通过SSL连接到ActiveMQ

时间:2016-01-12 12:55:55

标签: python ssl activemq stomp

我正在尝试连接到使用SSL的ActiveMQ消息代理。我收到了错误:

invalid uri: ssl://myserver.com:61613 [invalid broker(s): 'NoneType' object has no attribute 'groupdict']

从stompest文档中获取的示例代码:我只更改了服务器,用户并传递:

import time
from stompest.config import StompConfig
from stompest.sync import Stomp

while True:
    try:
        client = Stomp(StompConfig("ssl://myserver.com:61613", login = 'me', passcode = 'me', version = "1.2" ))
        client.connect(versions = ["1.2"], host = vhost, heartBeats = (0, 60000))   #CONNECT
        subscription = client.subscribe(destination, {"ack": "client", "id": "0"})  #SUBSCRIBE
        while True:
            frame = client.receiveFrame()
            try:
                print frame.body
                client.ack(frame)   #ACK
            except:
                print "Error: Can't handle message received, NACKing"
                client.nack(frame)  #NACK
    except Exception, e:
        # Reconnect on exception
        print "Exception handled, reconnecting...\nDetail:\n%s" % e
        try:
            client.disconnect()
        except:
            pass
        time.sleep(5)

我相信Stompest可以处理SSL,但我在文档中找不到任何参考。

由于

1 个答案:

答案 0 :(得分:0)

您的#if必须为SSLContext提供SSL连接配置。这个应该看起来究竟如何取决于您的设置细节,所以让我们看看一些选项。

有关如何设置ActiveMQ以使用SSL的更多信息,请参阅this Apache guidethis StackOverflow question,但stomp.py解决了相同的问题。

无验证

如果你需要的是一个快速而又脏的连接而没有验证代理或客户端 - 也就是说,一个易受来自活跃攻击者的MITM攻击的连接 - 那么你可以提供StompConfig禁用验证:

SSLContext

有了这个,您只需向import ssl sslContext = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) # Let's at least disable some of the older SSL protocols sslContext.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_SSLv3 sslContext.check_hostname = False sslContext.verify_mode = ssl.CERT_NONE 提供sslContext

StompConfig

经纪人证书验证

对此的第一个改进是验证服务器提供的证书。假设您使用的是自签名证书(而不是由证书颁发机构签名的证书),您可以直接向client = Stomp(StompConfig('ssl://myserver.com:61613', login='me', passcode='me', version='1.2', sslContext=sslContext)) 提供证书:

首先,在代理上,从其密钥库导出证书,我们假设该密钥库使用Java SSLContext通过

存储在名为broker.ks的文件中
keytool

现在,将keytool -exportcert -rfc -alias broker -keystore broker.ks -file broker.pem 移至Python客户端并更改broker.pem配置,如下所示:

sslContext

客户端证书验证

ActiveMQ服务器也可以设置为仅允许来自具有预定义证书的客户端的连接。假设您在sslContext = ssl.create_default_context(cafile='broker.pem') sslContext.check_hostname = True sslContext.verify_mode = ssl.CERT_REQUIRED 中有一个PEM编码的客户端证书,已将私钥存储在client.pem中(参见例如this answer的第一部分),并设置ApacheMQ以验证该证书(参见相同答案的第三部分),然后让client.key使用该对进行连接所需要做的就是调用

stompest

作为配置的一部分。