WebSocket协议的握手和数据帧
WebSocket是定义服务器和客户端如何通过Web通信的一种网络协议。协议是通信的议定规则。组成互联网的协议组由IETF(互联网工程任务组)发布。IETF发布评议请求(Request for Comments,RFC),精确地规定了协议(包括RFC 6455):WebSocket协议。RFC 6455于2011年12月发布,包含了实现WebSocket客户端和服务器时必须遵循的规则。
websocket基本上是一个很简单的协议, 主要流程非常少, 实现起来也很简单。
为简单起见, 下面只分析握手和数据帧的报文.
一. 握手(handshake).
握手协议由客户端发起, 服务器响应, 一来一回就完成了. 基本上是为了兼容现有的http 基础设施.
下面是一个客户端发起的握手请求:
47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET./.HTTP/1.1..
55 70 67 72 61 64 65 3A 20 77 65 62 73 6F 63 6B Upgrade:.websock 65 74 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 et..Connection:.
55 70 67 72 61 64 65 0D 0A 48 6F 73 74 3A 20 31 Upgrade..Host:.1 39 32 2E 31 36 38 2E 38 2E 31 32 38 3A 31 33 30 92.168.8.128:130 30 0D 0A 4F 72 69 67 69 6E 3A 20 6E 75 6C 6C 0D 0..Origin:.null. 0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 .Pragma:.no-cach 65 0D 0A 43 61 63 68 65 2D 43 6F 6E 74 72 6F 6C e..Cache-Control 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 53 65 63 2D :.no-cache..Sec- 57 65 62 53 6F 63 6B 65 74 2D 4B 65 79 3A 20 64 WebSocket-Key:.d 33 35 39 46 64 6F 36 6F 6D 79 71 66 78 79 59 46 359Fdo6omyqfxyYF 37 59 61 63 77 3D 3D 0D 0A 53 65 63 2D 57 65 62 7Yacw==..Sec-Web 53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 Socket-Version:.
31 33 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 13..Sec-WebSocke 74 2D 45 78 74 65 6E 73 69 6F 6E 73 3A 20 78 2D t-Extensions:.x- 77 65 62 6B 69 74 2D 64 65 66 6C 61 74 65 2D 66 webkit-deflate-f 72 61 6D 65 0D 0A 55 73 65 72 2D 41 67 65 6E 74 https://www.wendangku.net/doc/0c4136812.html,er-Agent 3A 20 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 57 :.Mozilla/5.0.(W 69 6E 64 6F 77 73 20 4E 54 20 36 2E 31 3B 20 57 indows.NT.6.1;.W 4F 57 36 34 29 20 41 70 70 6C 65 57 65 62 4B 69 OW64).AppleWebKi 74 2F 35 33 37 2E 33 36 20 28 4B 48 54 4D 4C 2C t/537.36.(KHTML, 20 6C 69 6B 65 20 47 65 63 6B 6F 29 20 43 68 72 .like.Gecko).Chr 6F 6D 65 2F 33 32 2E 30 2E 31 36 35 33 2E 30 20 ome/32.0.1653.0.
53 61 66 61 72 69 2F 35 33 37 2E 33 36 0D 0A 0D Safari/537.36... 0A
0D 0A 0D 0A, 也就是用"\r\n\r\n"收尾, 这和http头没什么区别. 转换成字符串就是:
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.8.128:1300
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36
其中有一对重要的kv, 就是Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==, 看上去是一个base64编码后的结果, 服务器需要对这个sec-key作一些处理, 并返回握手响应, 这个处理是:
也就是原封不动的拿着这个sec-key和另一个神奇的字符串
"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"相连, 再经过sha1摘要
算法处理, 最后再经过base64编码输出即可, 上面的输出结果应该是:
pLO2KC7b5t0TZl1E6A3sqJ6EzU4=
服务器在收到握手请求后, 如果愿意提供服务, 则返回一个握手响应, 如下:
遵循http的规则, 字节流上一样是要以"\r\n\r\n"收尾.
二. 数据帧
rfc6455上叫做非控制帧, 除了非控制帧之外, 就是控制帧. 包括connection close, ping, pong等帧, 这里只讲非控制帧, 也就是数据帧.
数据帧从长度上可以分为三种. 帧中的静荷数据(payload data)长度小于0x7E的为小帧, 静荷数据长度 >=0x7E又<=0x10000的为中帧,
再长的叫大帧.
数据帧从类型上暂时可以分为两种, 文本帧和二进制帧.
例子:
a). 一个从客户端发向服务端的小帧.
82
二进制为: 1000 0010, 最高位(FIN)为1, 表示这是最后一帧, 第一个帧也可能是最后一帧. 身后还有三位为预留. 低位四0010为操作码.
也就是0x02, 表示这是一个二进制帧, 0x01为文本帧.
B0
二进制为: 1011 0000, 最高位(MASK)为1, 表示当前帧的静荷数据部分使用了掩码, 事实上, rfc6455规定从客户端发往服务器端的数据帧
必需使用掩码, 反过来, 从服务器发回来的, 则必需不使用掩码. 低7位为静荷数据长度
字段, 这里是011 0000, 也就是0x30, 从上面的报文上
看, 这个0x30没有包含后面的掩码.
6A F7 C6 30
掩码, 掩码总是四个字节.
0A D9 C6...一直到最后为经过掩码加工后的静荷数据. 要回到数据本来的面目, 使用下面的算法:
得到的结果应该是:
b). 一个从服务器发给客户端的小帧.
更简单了, 还是82, 最后一帧, 二进制帧, 29, 0010 1001, 无掩码, 也就是身后全长为0x29.
c). 未使用掩码的中帧.
81 7E 01 00 66 77 88 ..., 帧长为 0x0100, 也就是256个字节.
d). 未使用掩码的大帧.
82 7F 00 00 00 00 11 22 33 44 66 77 88 ..., 帧长为0x0000000011223344, 直接跳过4字节, 而使用8字节来表示长度, 非常暴力.
这里需要注意的是, websocket要求使用最小帧原则, 也就是静荷数据长度小于0x7E帧, 不能使用中帧或大帧的来表示. 长度小于
0x10000的帧也不能用大帧来表示.
【编辑推荐】
1.网络协议X档案网络传输协议篇
2.应用Wireshark观察基本网络协议
3.移动网络性能揭秘--网络协议及性能提升实践
分类号单位代码 密级学号 学生毕业设计(论文)题目基于WebSocket的物联网实时通信 技术应用 作者XXX 院(系)信息工程学院 专业计算机科学与技术 指导教师XXX 答辩日期2014 年5 月17 日
XXX 毕业设计(论文)诚信责任书 本人郑重声明:所呈交的毕业设计(论文),是本人在导师的指导下独立进行研究所取得的成果。毕业设计(论文)中凡引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处。尽我所知,除文中已经注明引用的内容外,本论文不包含任何其他个人或集体已经公开发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。 本人毕业设计(论文)与资料若有不实,愿意承担一切相关的法律责任。 论文作者签名: 年月日
摘要 摘要 物联网技术是当代信息技术的重要组成之一,与名同义,物联网就是连接物品的网络。物联网通过智能感知、识别技术与普适计算、广泛应用于网络的融合中,形成人与物、物与物相联,实现信息化、远程管理控制和智能的网络[1]。物联网用途广泛,遍及医院护理、照明管控、智能交通等多个领域。 本文将物联网技术和WebSocket技术相结合,设计并实现了一个小型的远程心率检测及报警系统的上位机,以求减少医院在人力物力方面的投入,方便医生在远程通过客户端浏览器实时查看病人的心率。为了扩大使用范围和便于日后的升级维护工作,系统结构采用B/S模式,在后台利用传感器采集患者的心率信息并将其发送到服务器端,服务器在接收心率信息的同时利用WebSocket技术实时推送心率信息到客户端浏览器,供医生查看和分析。最后的测试结果显示本系统操作简便,具有良好的可扩展性,在效率方面也符合心率检测在实时性方面的要求。 关键字:物联网、传感器、WebSocket
SSL协议的分析及实现 文章出处:计算机与信息技术作者:令晓静田红心发布时间:2005-11-01 (西安电子科技大学ISN国家重点实验室,中国西安,710071) 1引言 SSL是一种在客户端和服务器端之间建立安全通道的协议。SSL一经提出,就在Internet上得到广泛的应用。SSL最常用来保护Web的安全。为了保护存有敏感信息Web的服务器的安全,消除用户在Internet上数据传输的安全顾虑。 OpenSSL是一个支持SSL认证的服务器.它是一个源码开放的自由软件,支持多种操作系统。OpenSSL软件的目的是实现一个完整的、健壮的、商业级的开放源码工具,通过强大的加密算法来实现建立在传输层之上的安全性。OpenSSL包含一套SSL协议的完整接口,应用程序应用它们可以很方便的建立起安全套接层,进而能够通过网络进行安全的数据传输。 2 SSL协议概述 SSL 是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于 WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。 SSL 以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标:(1)秘密性: SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。 ( 2)完整性: SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输 的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。 (3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户), SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性。 3 SSL协议的体系结构 SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。SSL实际上是共同工作的两层协议组成,如图1所示。从体系结构图可以看出SSL安全协议实际是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL记录协议组成的一个协议族。
SSL协议详解 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协议,为网上信用卡支付提供了全球性的标准。 https介绍 HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
Internet Engineering Task Force (IETF) I. Fette Request for Comments: 6455 Google, Inc. Category: Standards Track A. Melnikov ISSN: 2070-1721 Isode Ltd. December 2011 张开涛[译] WebSocket协议
摘要 WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信。用于这个的安全模型是通常由web浏览器使用的基于来源的安全模型。该协议包括一个打开阶段握手、接着是基本消息帧、TCP之上的分层(layered over TCP)。该技术的目标是为需要与服务器全双工通信且不需要依赖打开多个HTTP连接(例如,使用XMLHttpRequest或
编号:_______________本资料为word版本,可以直接编辑和打印,感谢您的下载 ssl握手协议报文头 甲方:___________________ 乙方:___________________ 日期:___________________
ssl 握手协议报文头 篇一:ssl 握手协议 篇二:第二章.对ssl 握手协议的研究 第六章.对ssl 的安全性分析 第七章.举例一种将usbkey 融入javajsse 框架的解决 方案client 处理和回应serverhello 阶段 客户端收到服务器发过来的那些消息,要做的是验证服 务器证书,发送自己的证书(如果双向认证) ,发送计算出 的预主密码, 发送证书验证消息。 收至V serverhello 在serverhello 阶段连续的发了多个消息,最先发出的 是serverhello , client 收到后将ssl 会话id ,服务器端的 一个随机数,协商出的 ssl 协议版本号以及密钥套件放到会 话缓存中。 收至V servercertificates 接下来收到的应该是 server 端的证书消息了,取出所 有的消息,最头上的是 server 证书,最末端的 ca 根证书。 在sunjdkjsse 中实现的ssl 是这样处理的: 第一章.对ssl 的基本概念和框架的介绍 第二章.对ssl 握手协议的研究(part-1 ) 第三章.对ssl 握手协议的研究(part-2) 第四章.对ssl 握手协议细节和实现的介绍 第五章.对ssl 记录协议细节和实现的介绍
从sslcontex 中取出trustmanager ,如果用过javassl 编程的同学应该知道,可以自己实现x509trustmanager和 x509keymanager两个接口来定制对证书的验证,sunjdk中 就是调用这个trustmanager的验证方法来验证证书(在解决浏览器检测到证书是自签名的时候跳出警告框的问题就是可以自己实现这个trustmanager来让浏览器不跳出警告框)。 jdk当然也有默认的证书验证实现,就是验证签名有效性,验证证书是否过期等。证书签名的有效性验证是在取证书链中某证书中的公钥验证前一个证书的签名,这样第一个证书就是用第二个证书的公钥来验证,那有人可能会问最后的根ca的证书谁来验证?根ca的证书是自签名的,就是自己给自己签名,没人管的了,jdk中某个文件中有存储一堆 可信任的证书发行机构的证书列表,如果你的根ca在那个列表中并对比后确实是那个根ca的证书那就ok,验证通过, 这个可信任的机构也可以自己实现那个trustmanager来添加设置。 收至V serverkeyexchange 消息 Rsa方式密钥交换消息则把消息中的加密用公钥放入会活缓存中,作为客户端这边握手阶段的写密钥而不是用服务器证书中的公钥。 dh方式的消息就把消息中的p,g,ys三个参数记录下来, 有这些client 端就可以计算出pre-master 了,只要回头再把自己这边的yc参数发过去,server端就也能计算出相同的pre-maseter 了。 收至V servercerttificatsRequest 消息
安全套接层SSL协议简介 SSL(Secure Sockets Layer)协议最先是由著名的Netscape公司开发的,现在被广泛用于Internet上的身份认证与Web服务器和用户端浏览器之间的数据安全通信。 制定SSL协议的宗旨是为通信双方提供安全可靠的通信协 议服务,在通信双方间建立一个传输层安全通道。SSL使用对称加密来保证通信保密性,使用消息认证码(MAC)来保证数据完整性。SSL主要使用PKI在建立连接时对通信双方进行身份认证。IETF的传输层安全(TLS)协议(RFC 2246 1999)及无线访问协议(WAP)论坛的无线传输层安全协 议(WTIS)都是SSI的后续发展。协议包括两个层次:其 较低的SSL记录层协议位于传输协议TCP/IP之上。SSL记录协议用来对其上层的协议进行封装。握手协议就在这些被封装的上层协议之中,它允许客户端与服务器彼此认证对方;并且在应用协议发出或收到第一个数据之前协商加密算法 和加密密钥。这样做的原因就是保证应用协议的独立性,使低级协议对高级协议是透明的。 目前,Internet上对7层网络模型的每一层都已提出了相应 的加密协议。在所有的这些协议中,会话层的SSL和应用层的SET与电子商务的应用关系最为密切。 因此,SSL已成为用户与Internet之间进行保密通信的事实
标准,支持SSL也已经成为每个浏览器的内置功能。SSL 包括握手和记录两个子协议。这两个子协议均可以提供与应用尤其是与HTTP的连接。这种连接经过了认证和保密,可以防止篡改。 SSL可以嵌入Internet的处理栈内,位于TCP/IP之上和应 用层之下,而不会对其他协议层造成太大影响。SSL同样能够与其他Internet应用一起使用,如Intranet和Extranet访问、应用安全、无线应用及Web服务等。通过对离开浏览 器的数据进行加密,并在其进入数据中心之后进行解密,SSL 实现对Internet的数据通信进行保护。 SSL对话是由连接和应用组成的。在连接对话期间,客户机和服务器交换证书并就安全参数进行磋商。如果客户机接受服务器的证书,就会建立一个主密钥,这个主密钥将被用来对随后进行的通信进行加密。 在应用对话期间,客户机和服务器之间可以安全地传递信息,如信用卡号、股票交易数据、个人医疗数据以及其他敏感数据。SSL提供以下三种机制以确保安全:认证,能够对服务器或连接各端的客户机和服务器进行认证;保密,能够对信息进行加密,只有交流信息的双方才能访问并理解加密信息;完整性,可以防止信息内容在未经检测的情况下被修改,接收方可以确信他们收到的是无法进行修改的信息。 保密通信过程中的一个关键步骤就是对双方身份进行认证。
最新基于websocket与java的多人聊天室实现架构 html5+websocket+javaEE7+tomcat8 JavaEE7 最新的websocket1.0 API Tomcat8开始支持websocket1.0 API 【Tomcat implements the Java WebSocket 1.0 API defined by JSR-356】 在编写代码之前你要导入javaEE7的jar包以便使用websocket API,将此项目部署到tomcat8里面。 具体代码如下: Java端: ChatAnnotation类; 使用的是注解的方式。 package websocket.chat;
import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import util.HTMLFilter; @ServerEndpoint(value = "/websocket/chat") public class ChatAnnotation { private static final Log log = LogFactory.getLog(ChatAnnotation.class); private static final String GUEST_PREFIX = "Guest"; private static final AtomicInteger connectionIds = new AtomicInteger(0); private static final Set
龙源期刊网 https://www.wendangku.net/doc/0c4136812.html, WebSocket安全漏洞及其修复 作者:曾德愚 来源:《数字技术与应用》2016年第09期 摘要: WebSocket使浏览器提供对Socket的支持,在客户端和服务器之间提供基于单TCP连接的双向通道,常用于实时性要求较高的场合,例如证券行情、在线互动游戏及设备同步等方面。但由于架构设计原因,WebSocket也存在不少安全问题,有些漏洞将导致极大的破坏,本文就危害较大的跨站WebSocket劫持漏洞进行原理分析,提出检测及修复方法。 关键词:WebSocket 漏洞修复 中图分类号:TP309 文献标识码:A 文章编号:1007-9416(2016)09-0198-01 1 序言 在WebSocket高效解决信息实时同步问题之前,一般采用轮询Polling和 Comet技术,不光造成设计复杂,同时带来系统额外负载。WebSocket较好地解决了此类问题。虽然WebSocket协议在最初设计的时候就充分考虑了安全保障,但任何软件产品都不可能十全十美,随着其被广泛使用,诸如Wireshark漏洞、Asterisk WebSocket Server DoS漏洞、特别是OpenStack Nova console WebSocket漏洞等安全问题出现,引起了业界对危害较大的跨站WebSocket劫持漏洞的关注。 WebSocket是持久化协议,提供全双工连接,基于TCP实现消息流,基于HTTP协议进行握手协议连接。在浏览器向服务器端申请切换到WebSocket协议之后,如果服务器端返回101响应,则服务器端基于相同端口完成协议切换,浏览器和服务器端之间可使用WebSocket API 传输文本和二进制消息。 2 漏洞原理 在创建全双工通信的过程中,客户端基于HTTP握手切换到WebSocket协议,在握手Get 请求中,Cookie头部把域名下的Cookie全部发送到服务器端,由于WebSocket协议没有规定服务器在握手阶段认证客户端身份的手段,所以服务器可采用任何身份认证机制,因此给黑客伪造握手请求绕过身份认证提供了极大可能,从而实现跨站请求伪造攻击。 例如,某用户被引导访问到在某元素中植入了WebSocket握手请求申请跟目标应用建立WebSocket连接的恶意网页,则自动发起连接请求,如果服务器端没有增加Origin检查机制,则该请求将切换到WebSocket协议,恶意网页不通过身份认证即连接至WebSocket服务器,实现窃取或修改服务器端信息。 3 漏洞检测
基于websocket和java的多人聊天室
最新基于websocket与java的多人聊天室实现架构 html5+websocket+javaEE7+tomcat8 JavaEE7 最新的websocket1.0 API Tomcat8开始支持websocket1.0 API 【Tomcat implements the Java WebSocket 1.0 API defined by JSR-356】 在编写代码之前你要导入javaEE7的jar包以便使用websocket API,将此项目部署到tomcat8里面。 具体代码如下: Java端: ChatAnnotation类; 使用的是注解的方式。 package websocket.chat;
import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import util.HTMLFilter; @ServerEndpoint(value = "/websocket/chat") public class ChatAnnotation { private static final Log log = LogFactory.getLog(ChatAnnotation.class); private static final String GUEST_PREFIX = "Guest"; private static final AtomicInteger connectionIds = new AtomicInteger(0); private static final Set
11.6 安全套接层SSL协议 SSL(Secure Sockets Layer)协议最先是由著名的Netscape公司开发的,现在被广泛用于Internet上的身份认证与Web服务器和用户端浏览器之间的数据安全通信。 制定SSL协议的宗旨是为通信双方提供安全可靠的通信协议服务,在通信双方间建立一个传输层安全通道。SSL使用对称加密来保证通信保密性,使用消息认证码(MAC)来保证数据完整性。SSL主要使用PKI在建立连接时对通信双方进行身份认证。IETF的传输层安全(TLS)协议(RFC 2246 1999)及无线访问协议(WAP)论坛的无线传输层安全协议(WTIS)都是SSI的后续发展。协议包括两个层次:其较低的SSL记录层协议位于传输协议TCP/IP之上。SSL记录协议用来对其上层的协议进行封装。握手协议就在这些被封装的上层协议之中,它允许客户端与服务器彼此认证对方;并且在应用协议发出或收到第一个数据之前协商加密算法和加密密钥。这样做的原因就是保证应用协议的独立性,使低级协议对高级协议是透明的。 目前,Internet上对7层网络模型的每一层都已提出了相应的加密协议。在所有的这些协议中,会话层的SSL和应用层的SET与电子商务的应用关系最为密切。 因此,SSL已成为用户与Internet之间进行保密通信的事实标准,支持SSL 也已经成为每个浏览器的内置功能。SSL包括握手和记录两个子协议。这两个子协议均可以提供与应用尤其是与HTTP的连接。这种连接经过了认证和保密,可以防止篡改。 SSL可以嵌入Internet的处理栈内,位于TCP/IP之上和应用层之下,而不会对其他协议层造成太大影响。SSL同样能够与其他Internet应用一起使用,如Intranet和Extranet访问、应用安全、无线应用及Web服务等。通过对离开浏览器的数据进行加密,并在其进入数据中心之后进行解密,SSL实现对Internet的数据通信进行保护。 SSL对话是由连接和应用组成的。在连接对话期间,客户机和服务器交换证书并就安全参数进行磋商。如果客户机接受服务器的证书,就会建立一个主密钥,这个主密钥将被用来对随后进行的通信进行加密。 在应用对话期间,客户机和服务器之间可以安全地传递信息,如信用卡号、股票交易数据、个人医疗数据以及其他敏感数据。SSL提供以下三种机制以确保安全:认证,能够对服务器或连接各端的客户机和服务器进行认证;保密,能够对信息进行加密,只有交流信息的双方才能访问并理解加密信息;完整性,可以防止信息内容在未经检测的情况下被修改,接收方可以确信他们收到的是无法进行修改的信息。 保密通信过程中的一个关键步骤就是对双方身份进行认证。SSL握手子协议就具有之一功能。服务器与客户机之间的以下举动可以使认证动作变得更快捷:客户机对服务器进行认证;让客户机和服务器选择所需要的密码算法和安全水平;服务器有选择地对客户机进行认证;使用公共密钥密码生成可以共享的密钥,随后利用这些密钥传输真正的保密数据;建立SSL连接。 SSL记录子协议负责加密数据的传送。以下动作可以使数据传送变得更快捷:数据被分解成小的可以使用的块,称作片断;通过一个具有完整性的“包装纸”使数据不被修改;数据加密后就可以贴上“包装纸”了。
WebSocket 简单使用
? ? ? ? ? 关于 WebSocket 我打算分如下几篇博文来探探路:WebSocket 简单使用(一) - 概念 WebSocket 简单使用(二) - 客户端 WebSocket 简单使用(三) - 服务器端 WebSocket 简单使用(四) - 完整实例 WebSocket 简单使用(五) - 模拟微信 连接键盘 功能
背景: 前几天老大突然发现微信有个链接键盘的功能, 我仔细想了下或许是使用 WebSocket 来实现的,又加上最近 HTML5的呼声愈来愈高,觉得有必要研究下 HTML5了。 HTML5作为下一代 WEB 标准,拥有许多引人注目的新特性,如 Canvas、本地存储、多媒 体 编 程 接 口 、 WebSocket 等 等 。 今 天 我 们 就 来 看 看 具 有 “Web TCP” 之 称 的 WebSocket.WebSocket 的出现是基于 Web 应用的实时性需要而产生的。这种实时的 Web 应用大家应该不陌生,在生活中都应该用到过,比如新浪微博的评论、私信的通知,腾讯的 WebQQ 等。让我们来回顾下实时 Web 应用的窘境吧。 在 WebSocket 出现之前,一般通过两种方式来实现 Web 实时用:轮询机制和刘技术;其 中轮询有不同的轮询,还有一种叫 Comet 的长轮询。 ? 轮询:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服
务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的缺 点是,当客户端以固定频率向服务 器发起请求的时候,服务器端的数据可能并没有更 新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。 ? 长轮询:是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器 端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者 时间过期, 通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非 常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提 高。 ? 流:常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。 服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务 器端的连 接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用 户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进 用户体验,同时 这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
引言 SSL是一种在客户端和服务器端之间建立安全通道的协议。SSL一经提出,就在Internet上得到广泛的应用。SSL最常用来保护Web的安全。为了保护存有敏感信息Web的服务器的安全,消除用户在Internet上数据传输的安全顾虑。OpenSSL是一个支持SSL认证的服务器.它是一个源码开放的自由软件,支持多种操作系统。OpenSSL软件的目的是实现一个完整的、健壮的、商业级的开放源码工具,通过强大的加密算法来实现建立在传输层之上的安全性。OpenSSL包含一套SSL 协议的完整接口,应用程序应用它们可以很方便的建立起安全套接层,进而能够通过网络进行安全的数据传输。 2 SSL协议概述 SSL 是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于 WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。 SSL 以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标: (1)秘密性: SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。 ( 2)完整性: SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输 的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。 (3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户), SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性。 3 SSL协议的体系结构 SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。SSL实际上是共同工作的两层协议组成,如图1所示。从体系结构图可以看出SSL安全协议实际是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL 记录协议组成的一个协议族。 图1 SSL体系结构 SSL记录协议为SSL连接提供了两种服务:一是机密性,二是消息完整性。为了实现这两种服务, SSL记录协议对接收的数据和被接收的数据工作过程是如何实现的呢? SSL记录协议接收传输的应用报文,将数据分片成可管理的块,进行数据压缩(可选),应用MAC,接着利用IDEA、DES、3DES或其他加密算法进行数据加密,最后增加由内容类型、主要版本、次要版本和压缩长度组成的首部。被接收的数据刚好与接收数据工作过程相反,依次被解密、验证、解压缩和重新装配,然后交给更高级用户。
使用spring WebSocket还有一种方法进行推送,就是使用STOMP协议进行推送,其核心思想就是订阅(subscribe)。 1.配置Spring的Configuration文件。 注一:Application-destination-prefix:用例对URL进行区分,这里的”/app”表明,如果想要使用这个message broker(消息代理),就需要在URL中添加”/app”。 注二:Stomp-endpoint:这里是一个stomp的一个借助WebSocket进行握手的配置。这个握手的interceptor在这里什么都不需要做,我们不再需要session了。 注三:simple-broker:非常重要,在这里我们只使用一个simple broker,但是将来可以使用一个更为复杂的broker(Apache ActiveMQ等)。可参考下图理解simple broker的作用。 2.实现一个HandshakeInterceptor(简单到没有) 3.我们可以写一个Controller用于管理这些“/app”请求。
这里的@MessageMapping(“/greeting”),将用来处理“/app/greeting”的STOMP的SEND请求。 这里的@SendTo(“/topic/show”),将所有订阅了(subscribe)“/topic/show”)的用户进行消息的推送,推送的内容就是函数的返回值”[hello]”。 这里的@SubscribeMapping(“/init/{id}”),一个新的订阅,这个订阅不是simple broker,但是也可以返回一个JSON的字符串。 4.开始编写web页面(使用jQuery)。 建立STOMP连接,之前要进行websocket连接(握手)。 订阅”/topic/show”
SET协议和SSL协议的比较 1.简介 ①SET协议 为了实现更加完善的即时电子支付,SET协议应运而生。SET协议(Secure Electronic Transaction),被称之为安全电子交易协议,是由Master Card和Visa 联合Netscape,Microsoft等公司,于1997年6月1日推出的一种新的电子支付模型。SET协议是B2C上基于信用卡支付模式而设计的,它保证了开放网络上使用信用卡进行在线购物的安全。SET主要是为了解决用户,商家,银行之间通过信用卡的交易而设计的,它具有的保证交易数据的完整性,交易的不可抵赖性等种种优点,因此它成为目前公认的信用卡网上交易的国际标准。 ②SSL协议 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 TLS与SSL在传输层对网络连接进行加密。 2.比较 ①工作流程比较 ㈠SET协议:SET交易过程中要对商家,客户,支付网关等交易各方进 行身份认证,因此它的交易过程相对复杂。 (1)客户在网上商店看中商品后,和商家进行磋商,然后发出请求购买信息。 (2)商家要求客户用电子钱包付款。 (3)电子钱包提示客户输入口令后与商家交换握手信息,确认商家和客户两端均合法。 (4)客户的电子钱包形成一个包含订购信息与支付指令的报文发送给商家。 (5)商家将含有客户支付指令的信息发送给支付网关。 (6)支付网关在确认客户信用卡信息之后,向商家发送一个授权响应的报文。 (7)商家向客户的电子钱包发送一个确认信息。 (8)将款项从客户帐号转到商家帐号,然后向顾客送货,交易结束。 从上面的交易流程可以看出,SET交易过程十分复杂性,在完成一次S ET 协议交易过程中,需验证电子证书9次,验证数字签名6次,传递证书7次,进行签名5次,4次对称加密和非对称加密。通常完成一个SET协议交易过程大约要花费1.5-2分钟甚至更长时间。由于各地网络设施良莠不齐,因此,完成一个SET协议的交易过程可能需要耗费更长的时间。 ㈡SSL协议:服务器认证阶段:
SSL协议的工作原理 图解安全套接字SSL协议的工作原理 1、密码学的相关概念 密码学(cryptography):目的是通过将信息编码使其不可读,从而达到安全性。明文(plain text):发送人、接受人和任何访问消息的人都能理解的消息。密文(cipher text):明文消息经过某种编码后,得到密文消息。加密(encryption):将明文消息变成密文消息。解密(decryption):将密文消息变成明文消息。算法:取一个输入文本,产生一个输出文本。加密算法:发送方进行加密的算法。解密算法:接收方进行解密的算法。密钥(key):只有发送方和接收方理解的消息对称密钥加密(Symmetric Key Cryptography):加密与解密使用相同密钥。非对称密钥加密(Asymmetric Key Cryptography):加密与解密使用不同密钥。 2、相关的加密算法介绍 DES算法即数据加密标准,也称为数据加密算法。加密过程如下: 在SSL中会用到分组DES、三重DES算法等加密算法对数据进行加密。当然可以选用其他非DES加密算法,视情况而定,后面会详细介绍。 3、密钥交换算法 使用对称加密算法时,密钥交换是个大难题,所以Diffie和Hellman提出了著名的Diffie-Hellman密钥交换算法。 Diffie-Hellman密钥交换算法原理: RSA加密算法是基于这样的数学事实:两个大素数相乘容易,而对得到的乘积求因子则
3、散列算法: 主要用于验证数据的完整性,即保证时消息在发送之后和接收之前没有被篡改对于SSL 中使用到的散列算法有MD5、SHA-1. 4、数字证书: 数字证书其实就是一个小的计算机文件,其作用类似于我们的身份证、护照,用于证明身份,在SSL中,使用数字证书来证明自己的身份,而不是伪造的。 5、简单的总结: 在SSL中会使用密钥交换算法交换密钥;使用密钥对数据进行加密;使用散列算法对数据的完整性进行验证,使用数字证书证明自己的身份。好了,下面开始介绍SSL协议。 SSL介绍: 安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。 SSL是Netscape于1994年开发的,后来成为了世界上最著名的web安全机制,所有主要的浏览器都支持SSL协议。 目前有三个版本:2、3、,最常用的是第3版,是1995年发布的。 SSL协议的三个特性 ① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。 ② 鉴别:可选的客户端认证,和强制的服务器端认证。 ③ 完整性:传送的消息包括消息完整性检查(使用MAC)。 SSL的位置 SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。 SSL的工作原理
SSL协议 百科名片 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 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协议,为网上信用卡支付提供了全球性的标准。 https介绍 HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP 应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。