ws隧道加密
A. WebSocket SSL 加密浅析
WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动请求。
都是基于TCP的应用层协议。
都使用Request/Response模型进行连接的建立。
在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。
都可以在网络中传输数据。
WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。
WS的连接不能通过中间人来转发,它必须是一个直接连接。
WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据。
WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。
WS的数据帧有序。
WebSocket 分为握手和数据传输
WebSocket 的握手基于http GET方法进行,
通过Http握手之后,如果是http 协议的话,tcp 连接会断开,这里在http 头部指明了升级为 websocket, 所以tcp 连接不断开。 WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范。 WebSocket 数据传输以数据帧的形式传输。
数据帧的结构如下图:
AndroidAsync 是一个基于nio的异步socket ,http(客户端服务器端),websocket,socket.io库,AndroidAsync 是一个底层的网络协议库。AndroidAsync 适合用于一个未被封装的Android的raw Socket, HTTP client/server, WebSocket, and Socket.IO。
特性
wss 建立在HTTPS 的基础上,在握手的时候使用HTTS 建立连接。HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS。
HTTPS 连接过程如下图:
AndroidSync API
AndroidSync 对ssl 的支持如下:
ssl 连接需要证书,通常证书是CA机构发布,保证权威性。但是也可以使用自签名证书。如12306.根据我们车机的特点,可以采用自签名证书。
HTTPS ,是一种网络安全传输协议,利用 SSL/TLS 来对数据包进行加密,以提供对网络服务器的身份认证,保护交换数据的隐私与完整性。 中间人攻击, Man-in-the-middle attack ,缩写: MITM ,是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。
https 在理论上是可以抵御 MITM ,但是由于开发过程中的编码不规范,导致 https 可能存在 MITM 攻击风险,攻击者可以解密、篡改 https 数据。 0X02 https 漏洞 Android https 的开发过程中常见的安全缺陷:
Android安全开发之安全使用HTTPS
窃听风暴:Android平台https嗅探劫持漏洞
浅析HTTPS中间人攻击与证书校验
B. 华为WS550路由器怎么更改加密方式
无线网络WiFi加密方式的设置方法:
1.打开电脑的wifi,搜索路由器默认wifi名(路由器背面铭牌有写),连接wifi网络。
C. 华为WS318路由器怎么设置端口转发。
你好! 华为WS318路由器安装设置的步骤如下:
1、首先,接好无线路由器之后需要检查是否通电,无线路由器是否正常亮灯运行。
2、检查无误后,查看路由器底部标牌说明,打开浏览器输入路由器IP,然后按ENTER进入,这个时候弹出一个对话框,需要输入帐户名和密码,在路由器的后面会有的,一般情况下都是:帐户名:admin 密码:admin。
3、按照路由器背后的账户密码输入登录后,就可以登陆到路由器的设置页面了。
4、点击页面的设置向导,按照它的要求一步步进行。
5、点击下一步,进入到账号密码设置,这个账号密码是当前网络上网的账号密码,如果不知道,可以咨询网络运营商。
6、设置好上网的账号密码之后就是无线上网的功能设置了,设置WIFI名称和WIFI密码,建议密码不要设置过于简单,容易被人破解,并且加密方式采用系统推荐就可以。
7、点击完成,重启路由器,设置已经成功了。
D. 华为路由器ws318加密设置怎样完成
1、打开浏览器,在地址栏输入路由器网关IP地址,用户名和密码一般如果你没改就是admin(
小写)
2、登录成功后就显示运行状态了,点击“无线设置”
3、再点击“无线安全设置”,无线网络名称(SSID),就是一个名字,你可以随便填,一般是字母+数字。
接下来就可以设置密码了,一般选择WPA-PSK/WPA2-PSK加密方法(密码
要8-16个的,可以字母数字
组合)
4、设置密码后,点击保存,提示重启
5、最后点击“系统工具”里的“重启路由器”即可重启路由。
E. 如何使用WebSocket
引擎支持最新的WebSocket Version 13。
在C++中使用
详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。
头文件中的准备工作
首先需要include WebSocket的头文件。
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。
class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
并Override下面的4个接口:
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
后面我们再详细介绍每个回调接口的含义。
新建WebSocket并初始化
WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。
新建一个WebSocket:
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://".
_wsiSendText->init(*this, "ws://echo.websocket.org")
WebSocket消息监听
在调用send发送消息之前,先来看下4个消息回调。
onOpen
init会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data)
{
if (!data.isBinary)
{
_sendTextTimes++;
char times[100] = {0};
sprintf(times, "%d", _sendTextTimes);
std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;
log("%s", textStr.c_str());
_sendTextStatus->setString(textStr.c_str());
}
}
onClose
不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。
void WebSocketTestLayer::onClose(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_wsiSendText = NULL;
}
CC_SAFE_DELETE(ws);
}
onError
客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error)
{
log("Error was fired, error code: %d", error);
if (ws == _wsiSendText)
{
char buf[100] = {0};
sprintf(buf, "an error was fired, code: %d", error);
_sendTextStatus->setString(buf);
}
}
send消息到服务器
在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。
发送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
发送二进制数据(多了一个len参数)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
主动关闭WebSocket
这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。
_wsiSendText->close();
在Lua中使用
详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。
创建WebSocket对象
脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。
wsSendText = WebSocket:create("ws://echo.websocket.org")
定义并注册消息回调函数
回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。
local function wsSendTextOpen(strData)
sendTextStatus:setString("Send Text WS was opened.")
end
local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end
local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end
local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
Lua中发送不区分文本或二进制模式,均使用下面的接口。
wsSendText:sendString("Hello WebSocket中文, I'm a text message.")
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。
wsSendText:close()
在JSB中使用
详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。
创建WebSocket对象
脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。
this._wsiSendText = new WebSocket("ws://echo.websocket.org");
设置消息回调函数
JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。
this._wsiSendText.onopen = function(evt) {
self._sendTextStatus.setString("Send Text WS was opened.");
};
this._wsiSendText.onmessage = function(evt) {
self._sendTextTimes++;
var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;
cc.log(textStr);
self._sendTextStatus.setString(textStr);
};
this._wsiSendText.onerror = function(evt) {
cc.log("sendText Error was fired");
};
this._wsiSendText.onclose = function(evt) {
cc.log("_wsiSendText websocket instance closed.");
self._wsiSendText = null;
};
send消息
发送文本,无需转换,代码如下:
this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");
发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。
_stringConvertToArray:function (strData) {
if (!strData)
returnnull;
var arrData = new Uint16Array(strData.length);
for (var i = 0; i < strData.length; i++) {
arrData[i] = strData.charCodeAt(i);
}
return arrData;
},
send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。
var buf = "Hello WebSocket中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);
this._wsiSendBinary.send(binary.buffer);
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。
onExit: function() {
if (this._wsiSendText)
this._wsiSendText.close();
}