在Cocos2dx-3.15中WSS的正确打开方式

前言

因为项目原因,需要对WebSocket通信进行加密(即使用wss协议)

虽然官方示例里虽然有wss相关的例子,但是代码和文档里面却没有对参数的进行详细的说明

导致在这个坑里浪费了一些时间,在这里记录一下

代码如下:

官方示例代码如下:也可点击链接查看更详细代码

1
wsSendText = cc.WebSocket:create("wss://echo.websocket.org", {"myprotocol_1", "myprotocol_2"}, "cacert.pem")

看到这个示例代码,我当时是这样理解的:

1
2
3
"wss://echo.websocket.org"       -- 类型为string wss链接地址
{"myprotocol_1", "myprotocol_2"} -- 类型为table,里面是用户自定义协议名称
"cacert.pem" -- 类型为string CA证书公钥地址

所以有了下面这段代码:

1
2
3
4
-- wss链接地址:wss://www.yygamesoft.com:8083
-- 我们没有自定义协议,所以使用的是空table:{}
-- 我们通过服务器生成的公钥:public.pem
local sock = cc.WebSocket:create("wss://www.yygamesoft.com:8083", {}, "public.pem")

然后就各种报错,大致错误信息就像下面一样:

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
2
3
 -- 这里需要注意一下:cacert.pem文件需要手动复制到项目根目录中 
-- cacert.pem文件路径:引擎根目录/tests/cpp-tests/Resources/cacert.pem
local socket = cc.WebSocket:create("wss://www.yygamesoft.com:8083", {"myprotocol_1", "myprotocol_2"}, "cacert.pem")
------ 本文结束------