我正在尝试连接到使用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,但我在文档中找不到任何参考。
由于
答案 0 :(得分:0)
您的#if
必须为SSLContext
提供SSL连接配置。这个应该看起来究竟如何取决于您的设置细节,所以让我们看看一些选项。
有关如何设置ActiveMQ以使用SSL的更多信息,请参阅this Apache guide和this 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
作为配置的一部分。