2011-05-13 4 views
16

민감한 데이터로 인해 안전하게 암호화되어야하는 실시간 스트림을 제공하고 싶습니다.파이썬에서 안전한 WebSocket (wss : //) 서버를 구현하려면 어떻게해야합니까?

나는 성공적으로 직접 프론트 엔드를 모두 gevent을 사용하고 gunicorn 스트리밍 정상 WebSocket을 있어요,하지만 지금은 보안을해야하고,이 중 하나를 찾고 있어요 :

  1. 서버 보안 역할을 할 수 보안되지 않은 WebSocket 연결을 수신하는 (예를 들어) gunicorn으로 프록시되는 WebSocket 연결입니다.
  2. 안전한 WebSocket 연결을 직접 제공 할 수있는 프레임 워크입니다. 나는 토네이도를보고 그것을 다룰 수 있다고 믿었지만, 나는 여전히 제안에 개방되어있다.
  3. PUB/SUB 패턴에 ZeroMQ를 사용합니다. ZeroMQ를위한 좋은 WebSocket 프로토콜 구현이 있다면, 좋을 것입니다.

연결 수가 적기 때문에 속도가 중요하지 않습니다. 그러나 데이터의 무결성이 중요합니다.

답변

2

Google에서 지원하는 pywebsocket 프로젝트의 standalone websockets server을 살펴보세요.

이 Python 모듈은 CGIHTTPServer을 사용하므로 보안을 위해이 모듈을 조정해야합니다. 나는 몇 달 전에 참여한 프로젝트와 비슷한 요구 조건을 가지고 있었기 때문에 standalone.py 모듈을 포크하고 CGI로 종속성을 제거했지만 보안 연결을 많이 테스트하지 않았습니다.

아마도 OpenSSL.SSL을 가져올 수 있으며 내 스크립트에 그대로 WebSocketServer을 설정할 수 있습니다. 적절한 구성이 use_tls, private_keycertificateWebSocketRequestHandler을 사용하여 TLS (전송 계층 보안)를 구현해야합니다.

소스 코드를 읽으십시오. 나는 당신이 당신의 필요를 충족시키기 위해 그것을 확장 할 수 있다고 생각합니다.

+0

+1이 구현은 매우 가볍기 때문에 (하나의 작은 파이썬 모듈 파일, 의존성 없음) 상자 밖에서 ws와 wss를 모두 지원합니다. –

5

websockify 프로젝트를 확인할 수 있습니다. WebSockify는 WebSocket 지원 브라우저가 원시 2 진 TCP 서버와 통신 할 수있게 해주는 프록시입니다. 브라우저에서 모든 트래픽을 인코딩하는 base64로이 작업을 수행합니다. 그러나 프로젝트는 모듈 식이며 websocket.py 파일은 확장되도록 설계된 일반 WebSocket 서버입니다 (그리고이 작동 방식을 보여주는 몇 가지 테스트가 있습니다). 프로젝트에 필요하지 않은 경우 base64 인코딩을 사용하지 않도록 설정하는 것이 매우 쉽습니다.

Websockify에는 websockify와 상호 작용하도록 설계된 Javascript 라이브러리 'websock.js'도 포함되어 있습니다. 브라우저에 기본 WebSocket 지원이없는 경우 투명하게 web-socket-js (플래시 기반)을 사용합니다.

Websockify는 보안 (TLS/wss) 연결을 지원하고 같은 포트에서 인라인으로 플래시 보안 정책 요청에 응답 할 수 있습니다.

면책 조항 : websockify를 작성했습니다.

3

우리는 실시간 응용 프로그램에 Tornado와 Tornadio를 사용하고 웹 소켓 용 SSL뿐만 아니라 다른 모든 실시간 socket.io 프로토콜도 사용했습니다. 그것은 단지 1 시간 이상 걸렸다!여기에 더 많은 정보는 :

app.listen(args.listen_port, args.listen_interface) 

에 :

app.listen(args.listen_port, args.listen_interface, ssl_options={ 
     "certfile": os.path.join(lib_dir, "mydomain.crt"), 
     "keyfile": os.path.join(lib_dir, "mydomain.key"), 
    }) 

http://devblog.resolversystems.com/?p=1084

+1

링크가 끊어졌습니다. –

7

은 앱이 아닌 SSL 토네이도 WebSocket을 통해 제대로 실행 가지고, (가)에서 전화를 듣다 변경 가정 여기서 "mydomain.crt"및 "mydomain.key"는 일반적인 SSL 인증서 파일이고 lib_dir은 그들이 살고있는 디렉토리입니다.

은 "WSS :"를 사용하도록 클라이언트를 변경하는 것을 잊지 마세요

또한 포트 당신이 ssl_options를 지정하면 여전히 사용될들을 호출에서 지정한 있습니다. 즉,이 서버 측에서 포트 443

1

에 듣기로 복귀하지 않습니다 토네이도에 이것을 추가 :

tornadio2.server.SocketServer(application, ssl_options={ 
    "certfile": "server.crt", 
    "keyfile": "server.key", 
}) 

를 클라이언트 측에서이 링크를 참조 : wss://www.example.com:2201/ws는 2201 보안 웹 소켓의 TLS입니다 포트.

관련 문제