Websocket Secure с использованием Javascript клиента и Python сервера - PullRequest
0 голосов
/ 27 апреля 2020

Я приступил к обучающему квесту о сокетах, особенно о веб-сокетах. Я sh использую веб-сайт php в качестве внешнего интерфейса, а в качестве сценария на стороне сервера использую обычный python скрипт (не через CGI). Я sh хочу использовать https для моей веб-страницы и защищенной версии веб-сокетов (wss), но не могу найти ничего, что работает. Может ли кто-нибудь указать мне правильное направление?

Вот мой Javascript клиент:

ws = new WebSocket('wss://192.168.2.150:8000/');
ws.onmessage = function(event){document.write("message received"); alert(event.data); ws.close();}
ws.onopen = function(){console.log("connection is established");}
ws.onerror = function(event) {
    console.error("ws fail:", event);
}

Веб-страница, на которой работает этот javascript, доступна для моего рабочего стола по адресу 192.168. .2.135.

На том же компьютере, на котором работает сервер apache2, также выполняется мой сценарий python. Этот python скрипт содержит сервер websockets. Это от Дэйва Р (https://github.com/dpallot/simple-websocket-server), но я немного его изменил. Вот этот код:


import signal
import sys
import ssl
from SimpleWebSocketServer import WebSocket, SimpleWebSocketServer, SimpleSSLWebSocketServer
from optparse import OptionParser

class SimpleEcho(WebSocket):

   def handleMessage(self):
      self.sendMessage(self.data)

   def handleConnected(self):
      pass

   def handleClose(self):
      pass

clients = []


if __name__ == "__main__":

   parser = OptionParser(usage="usage: %prog [options]", version="%prog 1.0")
   parser.add_option("--host", default='192.168.2.150', type='string', action="store", dest="host", help="hostname (192.168.2.150)")
   parser.add_option("--port", default=8000, type='int', action="store", dest="port", help="port (8000)")
   parser.add_option("--example", default='echo', type='string', action="store", dest="example", help="echo, chat")
   parser.add_option("--ssl", default=1, type='int', action="store", dest="ssl", help="ssl (1: on (default), 0: off")
   parser.add_option("--cert", default='/var/www/html/mainframe/ssl/cacert.pem', type='string', action="store", dest="cert", help="cert (/var/www/html/mainframe/ssl/cacert.pem)")
   parser.add_option("--key", default='/var/www/html/mainframe/ssl/cakey.pem', type='string', action="store", dest="key", help="key (/var/www/html/mainframe/ssl/cakey.pem)")#/etc/ssl/private/apache-selfsigned.key
   parser.add_option("--ver", default=ssl.PROTOCOL_TLSv1, type=int, action="store", dest="ver", help="ssl version")

   (options, args) = parser.parse_args()

   cls = SimpleEcho
   if options.example == 'chat':
      cls = SimpleChat

   if options.ssl == 1:
      server = SimpleSSLWebSocketServer(options.host, options.port, cls, options.cert, options.key, version=options.ver)
   else:
      server = SimpleWebSocketServer(options.host, options.port, cls)

   def close_sig_handler(signal, frame):
      server.close()
      sys.exit()

   signal.signal(signal.SIGINT, close_sig_handler)

   server.serveforever()

Используя Wireshark, я вижу, что мой клиент и сервер выполняют рукопожатие, и когда браузер отправляет «Client Hello», сервер резонирует с «Server Hello» и ключом. Затем клиент отправляет обратно свой ключ шифрования. Но затем браузер отправляет «Предупреждение о шифровании». Что это значит? Это как-то связано с моим самозаверяющим сертификатом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...