簡體   English   中英

Python最笨拙,無法通過SSL連接到ActiveMQ

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM