前言
因为项目原因,需要对WebSocket通信进行加密(即使用wss协议)
虽然官方示例里虽然有wss相关的例子,但是代码和文档里面却没有对参数的进行详细的说明
导致在这个坑里浪费了一些时间,在这里记录一下
代码如下:
官方示例代码如下:也可点击链接查看更详细代码
1 | wsSendText = cc.WebSocket:create("wss://echo.websocket.org", {"myprotocol_1", "myprotocol_2"}, "cacert.pem") |
看到这个示例代码,我当时是这样理解的:
1 | "wss://echo.websocket.org" -- 类型为string wss链接地址 |
所以有了下面这段代码:
1 | -- wss链接地址:wss://www.yygamesoft.com:8083 |
然后就各种报错,大致错误信息就像下面一样:
11-16 15:16:30.861: D/WebSocket.cpp(17297): scheme: wss, host: www.yygamesoft.com, port: 8082, path:
11-16 15:16:30.861: D/WebSocket.cpp(17297): CA file (/data/data/org.cocos2dx.yynn/files/server.pem) in writable path exists!
11-16 15:16:30.871: D/WebSocket.cpp(17297): NOTICE: Creating Vhost 'default' port -1, 1 protocols, IPv6 on
11-16 15:16:30.891: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) Unhandled websocket event: 32
11-16 15:16:30.901: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) Unhandled websocket event: 29
11-16 15:16:30.961: D/WebSocket.cpp(17297): ERR: SSL connect error 337047686: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
11-16 15:16:30.961: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) onConnectionError, state: 0 ...
11-16 15:16:30.961: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) onConnectionClosed, state: 2 ...
11-16 15:16:30.961: D/WebSocket.cpp(17297): onConnectionClosed, WebSocket (0xb8d69640) is closing by server.
11-16 15:16:30.971: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) onConnectionClosed DONE!
11-16 15:16:30.971: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) Unhandled websocket event: 45
11-16 15:16:30.971: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) Unhandled websocket event: 33
11-16 15:16:30.981: D/cocos2d-x debug info(17297): [LUA-print] -> wsSendTextError
11-16 15:16:30.981: D/cocos2d-x debug info(17297): [LUA-print] -> wsSendTextClose
11-16 15:16:30.991: D/WebSocket.cpp(17297): WebSocket (0xb8d69640) onConnectionClosed, state: 3 ...
11-16 15:16:31.751: D/cocos2d-x debug info(17297): [LUA-print] ->无法连接到服务器,请退出!!
错误信息表示是证书出了问题,无法通过服务器SSL验证。不管证书从服务器生成还是从浏览器导出都会报错,这就十分尴尬。当时论坛并搜不到关于这方面的解答,就只有在论坛发帖求助。所幸的是,折腾了大半天,还是找到了解决方案。
最终,解决方案就是不要使用自己的证书和自定义协议,使用默认的就行,感觉很嘲讽。
1 | -- 这里需要注意一下:cacert.pem文件需要手动复制到项目根目录中 |