[英]Unable to connect python container to activeMQ Artemis container
[英]Python stompest unable to connect to ActiveMQ over SSL
我正在嘗試連接到使用SSL的ActiveMQ消息代理。 我收到錯誤消息:
invalid uri: ssl://myserver.com:61613 [invalid broker(s): 'NoneType' object has no attribute 'groupdict']
摘自最笨拙的文檔的示例代碼:我僅更改了服務器,用戶和密碼:
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,但是我在文檔中找不到任何參考。
謝謝
必須為您的StompConfig
提供SSLContext
以及SSL連接的配置。 確切的外觀取決於您的設置細節,因此讓我們來看看其中的一些選項。
有關如何將ActiveMQ設置為通常使用SSL的更多信息,請參閱本Apache指南以及該StackOverflow問題 , 該問題解決了stomp.py
的相同問題。
如果您需要的是一個快速且骯臟的連接,而沒有對代理或客戶端的驗證,即該連接容易受到來自活動攻擊者的MITM攻擊,那么您可以提供一個禁用驗證的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
這樣,您所需要做的就是為您的StompConfig
提供sslContext
:
client = Stomp(StompConfig('ssl://myserver.com:61613', login='me', passcode='me', version='1.2', sslContext=sslContext))
對此的第一個改進是驗證服務器提供的證書。 假設您使用的是自簽名證書(而不是由證書頒發機構簽名的證書),則可以直接向SSLContext
直接提供證書:
首先,在券商,其密鑰庫,我們將承擔被存儲在一個文件名為導出證書broker.ks
使用Java keytool
通過
keytool -exportcert -rfc -alias broker -keystore broker.ks -file broker.pem
現在,將broker.pem
移至Python客戶端,並如下更改sslContext
配置:
sslContext = ssl.create_default_context(cafile='broker.pem')
sslContext.check_hostname = True
sslContext.verify_mode = ssl.CERT_REQUIRED
還可以將ActiveMQ服務器設置為僅允許來自具有預定義證書的客戶端的連接。 假設您在client.pem
有一個PEM編碼的客戶端證書,並且已經將私鑰存儲在client.key
(例如,參見該答案的第一部分),並設置了ApacheMQ來驗證該證書(參見該部分的第三部分)。相同的答案),那么所有你需要做的,有stompest
使用對用於連接是調用
sslContext.load_cert_chain('client.pem', 'client.key')
作為配置的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.