Я приступил к обучающему квесту о сокетах, особенно о веб-сокетах. Я 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» и ключом. Затем клиент отправляет обратно свой ключ шифрования. Но затем браузер отправляет «Предупреждение о шифровании». Что это значит? Это как-то связано с моим самозаверяющим сертификатом?