AutobahnPython w/Twisted: ssl.optionsForClientTLS на websocket.WampWebSocketClientFactory
Я не могу использовать 'applicationRunner', потому что он не поддерживает автоматическое переподключение (GitHub Issues: # 295 # 389) для веб-сокетов. Я вернулся к устаревшему подходу, который использует витую 'ReconnectingClientFactory'. Моя проблема в том, что этот подход не позволяет мне добавить 'ssl.optionsForClientTLS' для строгой проверки имени хоста и сертификата сервера. Есть ли способ сделать это?
Очень ценю любые отзывы!
class MyClientFactory(websocket.WampWebSocketClientFactory, ReconnectingClientFactory):
maxDelay = config.maxretry
def clientConnectionFailed(self, connector, reason):
logging.debug("Connection Failed: %s", reason)
ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)
def clientConnectionLost(self, connector, reason):
logging.debug("Connection Lost: %s", reason)
ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
def start():
log.startLogging(sys.stdout)
component_config = types.ComponentConfig()
session_factory = wamp.ApplicationSessionFactory(config=component_config)
session_factory.session = MyFrontendComponent
transport_factory = MyClientFactory(session_factory, 'wss://services:8443/ws', debug=True)
transport_factory.debug = True
transport_factory.debugCodePaths = True
websocket.connectWS(transport_factory)
Thread(target=reactor.run, args=(False,)).start()
1 ответ
Неважно, разобрался... надеюсь, это поможет любому, кто столкнется с той же проблемой. Оказывается, 'connectWS' принимает 'contextFactory' с 'optionsForClientTLS'. Теперь у нас есть автоматическое переподключение WebSocket со строгой проверкой сертификата:
class MyClientFactory(websocket.WampWebSocketClientFactory, ReconnectingClientFactory):
maxDelay = 30
def clientConnectionFailed(self, connector, reason):
logging.debug("Connection Failed: %s", reason)
self.retry(connector)
def clientConnectionLost(self, connector, reason):
logging.debug("Connection Lost: %s", reason)
self.retry(connector)
def start():
log.startLogging(sys.stdout)
component_config = types.ComponentConfig()
session_factory = wamp.ApplicationSessionFactory(config=component_config)
session_factory.session = MyFrontendComponent
transport_factory = MyClientFactory(session_factory, 'wss://services:8443/ws', debug=True)
transport_factory.debug = True
transport_factory.debugCodePaths = True
context_factory = None
if transport_factory.isSecure:
certData = getModule(__name__).filePath.sibling('server_cert.pem').getContent()
authority = ssl.Certificate.loadPEM(certData)
context_factory = ssl.optionsForClientTLS(u'services', authority)
websocket.connectWS(transport_factory, context_factory)
Thread(target=reactor.run, args=(False,)).start()