如何使用 TLS/SSL 确保 WebSocket 连接的安全
TLS 为传输层安全性协议,是 MySQL 在客户端与服务器之间进行加密连接的协议。TLS 有时被称为 SSL(安全套接层),但是 MySQL 实际上并不使用 SSL 协议进行加密连接,因为它的加密很弱。TLS 协议通过加密数据来确保在两个通信应用程序之间提供隐私和数据完整性,以便任何第三方都无法拦截通信。它还会验证对等方以验证其身份。通过在两个对等点之间提供安全的通信通道,TLS 协议可以保护消息的完整性并确保其不会被篡改。MySQL 支持多种 TLS 版本协议,此次测试使用 8.0 的 client 为 TLSv1.2。从 wireshark 中看一下 TLS 握手的步骤:
SSL (Secure Socket Layer) 为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:1)认证用户和服务器,确保数据发送到正确的客户机和服务器;2)加密数据以防止数据中途被窃取;3)维护数据的完整性,确保数据在传输过程中不被改变。SSL协议的工作流程:服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。TLS:安全传输层协议(TLS:Transport Layer Security Protocol)安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。 TLS 记录协议提供的连接安全性具有两个基本特性:私有――对称加密用以数据加密(DES 、RC4 等)。对称加密所产生的密钥对每个连接都是唯一的,且此密钥基于另一个协议(如握手协议)协商。记录协议也可以不加密使用。可靠――信息传输包括使用密钥的 MAC 进行信息完整性检查。安全哈希功能( SHA、MD5 等)用于 MAC 计算。记录协议在没有 MAC 的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。TLS 记录协议用于封装各种高层协议。作为这种封装协议之一的握手协议允许服务器与客户机在应用程序协议传输和接收其第一个数据字节前彼此之间相互认证,协商加密算法和加密密钥。 TLS 握手协议提供的连接安全具有三个基本属性:可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。共享加密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而, TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。协议结构TLS 协议包括两个协议组―― TLS 记录协议和 TLS 握手协议――每组具有很多不同格式的信息。在此文件中我们只列出协议摘要并不作具体解析。具体内容可参照相关文档。TLS 记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用 MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。TLS 连接状态指的是 TLS 记录协议的操作环境。它规定了压缩算法、加密算法和 MAC 算法。 TLS 记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和 MAC 密钥。 TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。
说明 步骤 1: 使用 wss: URI 方案WebSocket 协议定义了两种 URI 方案。ws: 用于未加密的连接,wss: 用于应加密的安全连接。要加密你的连接,请使用 wss: URI 方案。例如:JavaScriptvar webSocket = new Windows.Networking.Sockets.MessageWebSocket();webSocket.connectAsync("wss://www.example.com").done(function() {// connect succeeded}, function(e) {// connect failed});备注 有关 WebSocket URI 方案的其他详细信息,请参阅 WebSocket 协议。
部署SSL数字证书保证你的数据传输是加密的安全的——沃通CA机构做数字认证证书领域的领跑者,buy.wosign.com
带ssl的websocket例子: https://www.gworg.com/ssl/308.html 如果没有公网SSL证书,可以淘宝Gworg获取。

如何使用WebSocket
WebSocketServer wsServer = new WebSocketServer(); if (!wsServer.Setup("127.0.0.1", 2012)){//设置IP 与 端口失败通常是IP 和端口范围不对引起的 IPV4 IPV6}if (!wsServer.Start()){//开启服务失败 基本上是端口被占用或者被 某杀毒软件拦截造成的return;}wsServer.NewSessionConnected += (session) =>{//有新的连接};wsServer.SessionClosed += (session, reason) =>{//有断开的连接};wsServer.NewMessageReceived += (session, message) =>{//接收到新的文本消息};wsServer.NewDataReceived += (session, bytes) =>{//接收到新的二进制消息};Console.ReadKey(); wsServer.Stop();

springmvc是怎样接受websocket请求的
浏览器客户端和服务器建立起websocket的链接,最初也是http请求握手,通过httpServletRequest发送http请求到服务器,其中头部就包含需要请求websocket链接的一系列信息,大概过程如下 1.客户端请求一个链接,头部中包含如下信息GET /demo HTTP/1.1Host: example.comConnection: UpgradeSec-WebSocket-Key2: 12998 5 Y3 1 .P00Upgrade: WebSocketSec-WebSocket-Key1: 4@1 46546xW%0l 1 5Origin:http://example.com[8-byte security key]2.服务器根据头部中的Sec-WebSocket-Key2,Sec-WebSocket-Key1,Upgrade,[8-byte security key] 知道客户端需要一个websocket协议链接,于是返回一个消息,包含如下头部HTTP/1.1 101 WebSocket Protocol HandshakeUpgrade: WebSocketConnection: UpgradeWebSocket-Origin:http://example.comWebSocket-Location: ws://example.com/demo[16-byte hash response]3.客户端收到消息之后,建立起websocket链接,这时就可以进行实时通信了我们可以定义一个处理器来实现WebSocketHandler处理请求public class MyWebSocketHandler implementsWebSocketHandler{/*** webscoket建立好链接之后的处理函数* @param session 当前websocket的会话id,打开一个websocket通过都会生成唯一的一个会话,可以通过该id进行发送消息到浏览器客户端*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {// TODO Auto-generated method stub}/*** 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息*/@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {// TODO Auto-generated method stub}/*** 消息传输过程中出现的异常处理函数*/@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {// TODO Auto-generated method stub}/*** websocket链接关闭的回调*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {// TODO Auto-generated method stub}/*** 是否支持处理拆分消息,返回true返回拆分消息*/@Overridepublic boolean supportsPartialMessages() {// TODO Auto-generated method stubreturn false;}}websocket的链接建立是基于http握手协议,我们可以添加一个拦截器处理握手之前和握手之后过程public class MyHandShakeInterceptor implements HandshakeInterceptor{/*** 握手之前,若返回false,则不建立链接*/@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map attributes) throws Exception {// TODO Auto-generated method stubreturn true;}/*** 握手之后*/@Overridepublic void afterHandshake(ServerHttpRequest requestscjgcj.comServerHttpResponse response, WebSocketHandler wsHandler,Exception exception) {// TODO Auto-generated method stub}}接下来,需要我们把处理器和拦截器注册到spring websocket中@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new MyWebSocketHandler(), "/portfolio")//添加一个处理器还有定义处理器的处理路径.addInterceptors(new MyHandShakeInterceptor()).withSockJS();}}在这里我们用到.withSockJS(),SockJS是spring用来处理浏览器对websocket的兼容性,目前浏览器支持websocket还不是很好,特别是IE11以下.SockJS能关键浏览器能否支持websocket来提供三种方式用于websocket请求,三种方式分别是 WebSocket, HTTP Streaming以及 HTTP Long PollingSockJS提供了浏览器客户端的js库,在浏览器我们请求websocket就这么用var socket = new SockJS('/whats/portfolio');//项目名称 + 处理器拦截路径名就会打开的目的websocket链接口/*** 建立成功的回调函数*/socket.onopen = function() {console.log('open');};/*** 服务器有消息返回的回调函数*/socket.onmessage = function(e) {console.log('message', e.data);};/*** websocket链接关闭的回调函数*/socket.onclose = function() {console.log('close');};然后客户端发送一个消息document.getElementById("ws").onclick = function() {socket.send("fff");}服务器MyWebSocketHandler中,通过handlemessage接收消息并进行分发/*** 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息*/@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {//获取消息String body = (String) message.getPayload();//一系列的处理之后...//发送消息session.sendMessage(message);}session可以用来标注客户端id,相对于我们的httpsession,这样,如果我们想做一个精准推送和全部推送,我们可以这么做首先在自定义的处理其中,建一个队列来存储连进来的websocketsessionpublic class MyWebSocketHandler implementsWebSocketHandler{private List users = new ArrayList(); //存放WebSocketSession的队列/*** webscoket建立好链接之后的处理函数* @param session 当前websocket的会话id,打开一个websocket通过都会生成唯一的一个会话,可以通过该id进行发送消息到浏览器客户端*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {session.getAttributes().put("userid", "xxxx");//如果有用户登录,可以把用户的id绑定到session里面,便于后面做精准推送users.add(session); //每个链接来的客户端都把WebSocketSession保存进来}//...}然后呢,我们在接收到消息的时候,就可以直接的根据需要精准推送到用户或者全部推送了/*** 客户端发送服务器的消息时,的处理函数,在这里收到消息之后可以分发消息*/@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {// TODO Auto-generated method stubfor (WebSocketSession webSocketSession : users) {//Long id = (Long) session.getAttributes().get("userid");//可以通过获取userid进行匹配,从而进行精准推送message = new TextMessage("ggg");webSocketSession.sendMessage(message); //全部推送}} spring websocket大概的请求过程就是这样子,这是基础的请求过程,细心的同学可能发现,如果我有很多种不同的业务请求,是不是要写很多个处理器??能不能只实现一个处理器,然后由这个处理器来进行分发处理,做到类似springmvc的DispatcherServlet那样子??下次研究看看
用node.js安装WebSocket库: npm install ws然后建立serve
http://blog.csdn.net/yingxiake/article/details/51194125

websocket拦截器怎么获取session
WebSocket之获取HttpSession 由于WebSocket与Http协议的不同,故在使用常用的HttpSession方面就存在了一些问题。通过google翻阅到了在onOpen方法下使用HttpSession的方法。新建一个GetHttpSessionConfigurator类并继承Configurator类package per.zww.web;import javax.servlet.http.HttpSession;import javax.websocket.HandshakeResponse;import javax.websocket.server.HandshakeRequest;import javax.websocket.server.ServerEndpointConfig;import javax.websocket.server.ServerEndpointConfig.Configurator;/** 获取HttpSession**/public class GetHttpSessionConfigurator extends Configurator {@Overridepublic void modifyHandshake(ServerEndpointConfig sec,HandshakeRequest request, HandshakeResponse response) {// TODO Auto-generated method stubHttpSession httpSession=(HttpSession) request.getHttpSession();sec.getUserProperties().put(HttpSession.class.getName(),httpSession);}}然后在@ServerEndpoint注解里面添加configurator属性@ServerEndpoint(value="/socketTest",configurator=GetHttpSessionConfigurator.class)在onOpen方法里加入参数 EndpointConfig config即可获取HttpSession@OnOpenpublic void onOpen(Session session,EndpointConfig config) {HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName());System.out.println( httpSession.getAttribute("name"));sessionMap.put(session.getId(), session); }

如何使用 TLS/SSL 确保 WebSocket 连接的安全
TLS 为传输层安全性协议,是 MySQL 在客户端与服务器之间进行加密连接的协议。TLS 有时被称为 SSL(安全套接层),但是 MySQL 实际上并不使用 SSL 协议进行加密连接,因为它的加密很弱。TLS 协议通过加密数据来确保在两个通信应用程序之间提供隐私和数据完整性,以便任何第三方都无法拦截通信。它还会验证对等方以验证其身份。通过在两个对等点之间提供安全的通信通道,TLS 协议可以保护消息的完整性并确保其不会被篡改。MySQL 支持多种 TLS 版本协议,此次测试使用 8.0 的 client 为 TLSv1.2。从 wireshark 中看一下 TLS 握手的步骤:
说明 步骤 1: 使用 wss: URI 方案WebSocket 协议定义了两种 URI 方案。ws: 用于未加密的连接,wss: 用于应加密的安全连接。要加密你的连接,请使用 wss: URI 方案。例如:JavaScriptvar webSocket = new Windows.Networking.Sockets.MessageWebSocket();webSocket.connectAsync("wss://").done(function() {// connect succeeded}, function(e) {// connect failed});备注 有关 WebSocket URI 方案的其他详细信息,请参阅 WebSocket 协议。

本文由 在线网速测试 整理编辑,转载请注明出处。