2014-10-31 115 views
1

我想連接到我的websocket服務器,我基本需要通過https。WebSocket連接到自簽名服務器

from tornado.options import define, options 
from imaplib import Commands 
define("port", default=443, help="run on the given port", type=int) 

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
def __init__(self, *args, **kwargs): 
    super(WebSocketHandler, self).__init__(*args, **kwargs); 
    pass; 
def open(self): 
    print 'new connection' 
    self.write_message("connected") 

def on_message(self, message): 
    print 'message received %s' % message 
    self.write_message('message received %s' % message) 

def on_close(self): 
    print 'connection closed' 

def check_origin(self, origin): 
    return True; 

if __name__ == "__main__": 
    tornado.options.parse_command_line() 
    app = tornado.web.Application(
     handlers=[ 
      (r"/ws", WebSocketHandler) 
     ] 
    ) 
    data_dir = "/home/pi/projects/WebSocketOverHttps/"; 
    httpServer = tornado.httpserver.HTTPServer(app, ssl_options = { 
     "certfile": os.path.join(data_dir, "cert.crt"), 
     "keyfile": os.path.join(data_dir, "key.key"), 
    }); 
    httpServer.listen(options.port) 
    print "Listening on port:", options.port 
    tornado.ioloop.IOLoop.instance().start() 

的問題是,我的瀏覽器說:「WebSocket連接到‘WSS://192.168.1.8/ws’失敗:打開的WebSocket握手被取消」

什麼,我試圖做的一件事就是: 1)系統(贏8.1 PRO x64)的通過雙擊證書文件添加證書 2)添加證書Google Chrome瀏覽器在同一系統上(通過瀏覽器的設置)

我能夠連接到這臺服務器當我重新實現它使用http而不是https,所以物理連接到機器看起來OK。

我的證書是自簽名的,由命令生成:

sudo openssl req -x509 -nodes -days 365000 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt 

這是我嘗試連接到它:

var socket = new WebSocket("wss://192.168.1.8:443/ws"); 
+0

您有什麼版本的Chrome? IIRC,他們在一個版本中添加了「拒絕自簽名證書」修復,並在稍後添加了「在wss和https之間共享可接受的自簽名證書」,並且在之間基本上沒有辦法指定可接受的自簽名證書wss(全球忽略證書錯誤是唯一真正的解決方法)。 – abarnert 2014-10-31 23:10:44

+0

另外,我不認爲這個問題與你的代碼有任何關係。您可能想嘗試(a)在不使用python和tornado標籤的情況下搜索相似的問題,並且(b)查看您是否可以使用通用wss服務器(例如netcat的ws代理)重現問題。 – abarnert 2014-10-31 23:12:00

+0

「38.0.2125.111米」是我的Chrome版本 – Puchacz 2014-10-31 23:27:33

回答

2

由於@BenDarnell發佈,我們不得不接受這個證書通過瀏覽到該服務器的頁面。然後您的瀏覽器會通知該網站不受信任。讓你的瀏覽器使用這個不受信任的證書,這就是全部。以下是您需要在代碼中放置的代碼:

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
    loader = tornado.template.Loader(".") 
    self.write(loader.load("index.html").generate()); 

app = tornado.web.Application(
handlers=[ 
    (r"/ws", WebSocketHandler), 
    (r"/", MainHandler) 
]) 

data_dir = "/home/pi/projects/Something"; 
ssl_options_dict = { 
    "certfile": os.path.join(data_dir, "cert.crt"), 
    "keyfile": os.path.join(data_dir, "key.key"), 
}; 

httpServer = tornado.httpserver.HTTPServer(app, ssl_options = ssl_options_dict); 
相關問題