精华内容
下载资源
问答
  • QWebSocket 添加 SLL 加密的 Demo,支持单向认证和双向认证,支持windows和linux双平台。
  • Websocket SSL加密之android端(带重连)

    千次阅读 2017-09-25 15:12:39
    最近在开发Android手机端的websocket通信,用到了ssl加密。由于网上相关信息较少,而且大多较为杂乱,因此,就相关知识进行再次整理,希望对大家有用。1、WebSocket(带重连) 普通Android端WebSocket,不必多说,写...

    最近在开发Android手机端的websocket通信,用到了ssl加密。由于网上相关信息较少,而且大多较为杂乱,因此,就相关知识进行再次整理,希望对大家有用。

    1、WebSocket(带重连)

      普通Android端WebSocket,不必多说,写一类继承jar包中的WebSocketClient,然后依次调用该类的构造函数如:new WebSocketUtils()、链接函数:connectBlocking()完成连接即可与服务端进行通信。然而很多应用,都需要考虑到断开重连的问题,因此,在继承WebSocketClient的基础上需要自己去重新设计新类调用api进行断开时的重连。

    对于重连要特别说明一个问题,connectBlocking()是只有当前类对象的线程对象为null,才会开了一个线程去做通信链接,而closeBlocking()只会关闭端口,不会结束当前对象因调用connectBlocking()建立的线程。因此,不能使用connectBlocking()和closeBlocking()配合作重连功能。正确的重连设计是要调用closeBlocking()关闭原来的链接并重新new一个对象调用connectBlocking()进行链接。

    2、SSL加密

    SSL加密通信的过程主要有三个部分,分别是证书读取、创建并初始化证书和信任库工厂以及//创建并初始化SSLContext实例。具体代码示例如下:

    //证书读取
    FileInputStream input = new FileInputStream(m_creditpath);
    KeyStore ks = KeyStore.getInstance("bks");
    ks.load(input,m_password.toCharArray());
    input.close();
    				
    //创建并初始化证书和信任库工厂
    KeyManagerFactory kmfact = KeyManagerFactory.getInstance("SunX509");
    TrustManagerFactory tmfact = TrustManagerFactory.getInstance("X509");
    kmfact.init(ks,m_password.toCharArray());
    tmfact.init(ks);
    KeyManager[] kms = kmfact.getKeyManagers();
    TrustManager[] tms = tmfact.getTrustManagers();
    				
    //创建并初始化SSLContext实例
    SSLContext sslContext = null;
    sslContext = SSLContext.getInstance("SSL");
    sslContext.init(kms, tms, null);
    SSLSocketFactory factory = sslContext.getSocketFactory();
    如果不需要证书,只需要信任库工厂即可,因此,SSLContext实例初始化为:
    sslContext.init(null, new TrustManager[]{new X509TrustManager() {
    					
    	@Override
    	public X509Certificate[] getAcceptedIssuers() {
    	        // TODO Auto-generated method stub
    		return null;
    	}
    					
    	@Override
    	public void checkServerTrusted(X509Certificate[] chain, String authType)
    		throws CertificateException {
    		// TODO Auto-generated method stub	
    	}
    					
    	@Override
    	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    			// TODO Auto-generated method stub				
    	}
    }}, new SecureRandom());
    3、带SSL加密的WebSocket

    只需在调用继承jWebSocketClient的类构造函数和链接函数之间加入SSL加密的三部分,并调用WebSocketClient类的继承对象的setSocket函数即可。即:

    m_sock.setSocket(factory.createSocket(m_des.getHost(),m_des.getPort()));
    以上所有示例代码如下:
    package WebSocket;
    
    import java.net.URI;
    import java.util.Map;
    
    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.drafts.Draft;
    import org.java_websocket.handshake.ServerHandshake;
    
    import Protocol.ProtocolManager;
    import android.util.Log;
    
    public class WebSocketUtils extends WebSocketClient {
    	
        private static final String TAG = WebSocketUtils.class.getSimpleName();
    	
        private ProtocolManager m_callback = null;
    	
        private volatile boolean m_isopened = false;
    
        public WebSocketUtils(URI serverUri, Draft protocolDraft, Map<String, String> httpHeaders, int connectTimeout) {
            super(serverUri, protocolDraft, httpHeaders, connectTimeout);
        }
    
        @Override
        public void onOpen(ServerHandshake serverHandshake) {// 连接成功
            Log.i(TAG, "---onOpen---");
            m_isopened = true;
        }
    
        @Override
        public void onMessage(String payload) {
            if(null!=m_callback && null!=payload){
            	m_callback.dealData(payload);
            }
        }
    
        @Override
        public void onError(Exception e) {
        	if(null != m_callback)
        		m_isopened = false;
        }
    
        @Override
        public void onClose(int arg0, String arg1, boolean arg2) {
    	// TODO Auto-generated method stub
    	Log.i(TAG, "websocket is closed!");
    	m_isopened = false;
        }
    
        public ProtocolManager getM_callback() {
    	return m_callback;
        }
    
        public void setM_callback(ProtocolManager m_callback) {
            this.m_callback = m_callback;
        }
    
        public boolean isM_isopened() {
            return m_isopened;
        }
    
        public void setM_isopened(boolean m_isclosed) {
            this.m_isopened = m_isclosed;
        }
    }
    package WebSocket;
    
    import java.net.URI;
    import java.security.SecureRandom;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    
    import org.java_websocket.drafts.Draft_17;
    
    import android.util.Log;
    import Protocol.ProtocolManager;
    
    public class WebSocketHandler extends TimerTask{
    	
    	private WebSocketUtils m_sock = null;
    	
    	private static WebSocketHandler m_sockhandler = null;
    	
    	private ProtocolManager m_callback = null;
    	
    	private static final String TAG = WebSocketHandler.class.getSimpleName();
    	
    	private URI m_des = null;
    	
    	private Draft_17 m_draft = null;
    	
    	private int m_outtime;
    	
    	private volatile boolean m_iscon = false;
    	
    	private Timer m_timer;
    	
    	public synchronized static WebSocketHandler getInstance(){
    		if(null == m_sockhandler)
    			m_sockhandler = new WebSocketHandler();
    		return m_sockhandler;
    	}
    	
    	public void onCreate(){
    		m_iscon = false;
    		if(null == m_des || null == m_draft)
    			return ;
    		if(null == m_sock){
    			try{
    				m_sock = new WebSocketUtils(m_des, m_draft, null, m_outtime);
    				//创建并初始化SSLContext实例
    				SSLContext sslContext = null;
    				sslContext = SSLContext.getInstance("TLS");
    				sslContext.init(null, new TrustManager[]{new X509TrustManager() {
    					
    					@Override
    					public X509Certificate[] getAcceptedIssuers() {
    						// TODO Auto-generated method stub
    						return null;
    					}
    					
    					@Override
    					public void checkServerTrusted(X509Certificate[] chain, String authType)
    							throws CertificateException {
    						// TODO Auto-generated method stub
    						
    					}
    					
    					@Override
    					public void checkClientTrusted(X509Certificate[] chain, String authType)
    							throws CertificateException {
    						// TODO Auto-generated method stub
    						
    					}
    				}}, new SecureRandom());
    				SSLSocketFactory factory = sslContext.getSocketFactory();
    				//设置websocket为ssl加密
    				m_sock.setSocket(factory.createSocket(m_des.getHost(),m_des.getPort()));
    				if(m_sock.connectBlocking())
    					m_iscon = true;
    				else{
    					Log.e(TAG, "websocket connect fail");
    				}
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    		}
    		if(null == m_sock || null == m_callback)
    			return ;
    		m_sock.setM_callback(m_callback);
    		if(null == m_timer){
    			m_timer = new Timer(true);
    			m_timer.schedule(m_sockhandler, 100, 3000);
    			Log.i(TAG,"timer init success!");
    		}
    	}
    	
    	public boolean isM_iscon() {
    		return m_iscon;
    	}
    
    	public void setM_iscon(boolean m_iscon) {
    		this.m_iscon = m_iscon;
    	}
    
    	public void setParameter(URI p_uri, Draft_17 p_draft, int p_outtime, ProtocolManager p_callback){
    		if(null == p_uri || null == p_draft || null == p_callback)
    			return ;
    		m_des = p_uri;
    		m_draft = p_draft;
    		m_outtime = p_outtime;
    		m_callback = p_callback;
    	}
    	
    	public boolean sendMessage(String p_data){
    		if(null == p_data)
    			return false;
    		if(m_iscon){
    			try{
    				m_sock.send(p_data);
    				return true;
    			}catch(Exception e){
    				Log.e(TAG, "NotYetConnectedException");
    				return false;
    			}
    		}else
    			return false;
    	}
    	
    	public synchronized void reConnect(){
    		if(null == m_sock){
    			onCreate();
    		}
    		if(!m_iscon){
    			Log.e(TAG, "websocket reconnect fail");
    			return ;
    		}
    		m_callback.setM_keepalive(0);
    	}
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		if(null != m_callback){
    			m_iscon = m_sock.isM_isopened();
    			if(m_callback.getM_keepalive() < 3 && m_iscon){
    				m_callback.addM_keepalive();
    				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    				Date curDate = new Date(System.currentTimeMillis());
    				Log.i(TAG, curDate.toString());
    				sendMessage(m_callback.createKeepalive(format.format(curDate)));
    			}else{
    				try {
    					if(m_iscon)
    						m_sock.closeBlocking();
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    					return ;
    				}
    				m_sock = null;
    				Log.i(TAG, "websocket connect " + m_callback.getM_keepalive() + " m_iscon: " + m_iscon);
    				reConnect();
    			}
    		}
    	}
    	
    	public void destroy(){
    		m_sock.close();
    		m_sock = null;
    	}
    }
    展开全文
  • 我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信不够安全,想要对通信进行加密,于是自然而然地就想从ws升级到wss。在升级的过程中,就会存在旧的ws客户端与新的wss客户端同时连接到同一个服务器的情况...

        自从HTML5出来以后,使用WebSocket通信就变得火热起来,基于WebSocket开发的手机APP和手机游戏也越来越多。我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信不够安全,想要对通信进行加密,于是自然而然地就想从ws升级到wss。在升级的过程中,就会存在旧的ws客户端与新的wss客户端同时连接到同一个服务器的情况。所以,如果同一个服务端,能同时支持ws和wss,那就太方便了。

    一. 实现方案

      但是,要服务端同时支持ws与wss并不太容易,其难点主要在于:wss通道必须在TCP连接刚建立时(收发消息前)就要先进行SSL加密,否则,后续的通信将无法正常进行。如此一来,当同时存在ws和wss客户端时,服务器在尚未通信之前就无法具体分辨哪个是ws哪个是wss。那怎么办了?我们的解决方案,是采用试探法,该方案已经在 ESFramework 通信框架中实现。 

    (1)由于wss通道必须在TCP连接刚建立时(收发消息前)就要先进行SSL加密,否则,后续的通信将无法正常进行。

    (2)基于(1),在没有收发任何消息时,服务端就无法将wss客户端与其它客户端区分开来。

    (3)为此采用的办法是:对于任何刚建立的TCP连接,先都不加密它,等收到的第一个消息来判断其消息的头标志。

    (4)如果头标志不是ESFramework所规定的标志,则表示这第一个消息是密文,无法被解析,从而说明这个客户端是wss。于是将该客户端的ip放到cache中,并断开该连接。

    (5)wss客户端会重新连上来,此时服务端从cache中发现已经存在目标ip,则判定其为wss客户端,于是立即使用SSL加密该通道,之后,该wss客户端就可以正常通信了。

    (6)由于wss 客户端 IP在cache中的过期时间是 6秒左右,所以,如果一个客户端IP刚登录了wss客户端,那么在同一个IP上登录第二个客户端(任何客户端类型),就需要相隔6秒之后。

       基于以上方案实现服务端后,我们接下来基于 ESFramework入门demo 来具体讲解一下如何在实际应用中同时支持ws和wss。

    二. 服务端实现

    1. 数字证书

          为测试方便,我们可以使用 CertificateCreator 制作一个用于本地测试的数字证书。

          运行 CertificateCreator.exe, 然后输入Common Name(比如Test)、密码、保存路径(比如D:\server.pfx),我们就可以得到包含私钥的证书server.pfx 。双击server.pfx ,即可安装证书。 

    2. 服务端引擎设置

           在服务端RapidServerEngine初始化之前,添加如下代码设置其 WssOptions 属性:

            WssOptions wssOptions = new WssOptions( new X509Certificate2("D:\\server.pfx", "password") ,SslProtocols.Default ,false);
            rapidServerEngine.WssOptions = wssOptions;   

            设置完成后,启动服务端。 

    三. 客户端实现

    1. 信任测试用的数字证书      

            由于上述生成的数字证书仅仅是用于测试的,而是不被正式认可的,所以,需要在浏览器设置中,将目标数字证书加入到信任列表。        

            比如在FireFox中,设置如下:

             

              将服务器的地址(https://127.0.0.1:4530)添加到例外中。  

    2. 客户端引擎设置

            打开入门demo的Web端源码中的index.js文件,找到engine的Initialize方法,将 useWss 参数由false修改为true。

            然后将Web端的 index.html 文件拖入浏览器中运行即可。 

    四. 运行效果

           登录一个wss客户端,一个ws客户端和一个.NET客户端,服务端的UI显示如下:

           

            下载 Demo源码 。

    展开全文
  • 我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信不够安全,想要对通信进行加密,于是自然而然地就想从ws升级到wss。在升级的过程中,就会存在旧的ws客户端与新的wss客户端同时连接到同一个服务器...

           自从HTML5出来以后,使用WebSocket通信就变得火热起来,基于WebSocket开发的手机APP和手机游戏也越来越多。我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信不够安全,想要对通信进行加密,于是自然而然地就想从ws升级到wss。在升级的过程中,就会存在旧的ws客户端与新的wss客户端同时连接到同一个服务器的情况。所以,如果同一个服务端,能同时支持ws和wss,那就太方便了。

    一. 实现方案

      但是,要服务端同时支持ws与wss并不太容易,其难点主要在于:wss通道必须在TCP连接刚建立时(收发消息前)就要先进行SSL加密,否则,后续的通信将无法正常进行。如此一来,当同时存在ws和wss客户端时,服务器在尚未通信之前就无法具体分辨哪个是ws哪个是wss。那怎么办了?我们的解决方案,是采用试探法,该方案已经在 ESFramework 通信框架中实现。 

    (1)由于wss通道必须在TCP连接刚建立时(收发消息前)就要先进行SSL加密,否则,后续的通信将无法正常进行。

    (2)基于(1),在没有收发任何消息时,服务端就无法将wss客户端与其它客户端区分开来。

    (3)为此采用的办法是:对于任何刚建立的TCP连接,先都不加密它,等收到的第一个消息来判断其消息的头标志。

    (4)如果头标志不是ESFramework所规定的标志,则表示这第一个消息是密文,无法被解析,从而说明这个客户端是wss。于是将该客户端的ip放到cache中,并断开该连接。

    (5)wss客户端会重新连上来,此时服务端从cache中发现已经存在目标ip,则判定其为wss客户端,于是立即使用SSL加密该通道,之后,该wss客户端就可以正常通信了。

    (6)由于wss 客户端 IP在cache中的过期时间是 6秒左右,所以,如果一个客户端IP刚登录了wss客户端,那么在同一个IP上登录第二个客户端(任何客户端类型),就需要相隔6秒之后。

       基于以上方案实现服务端后,我们接下来基于 ESFramework入门demo 来具体讲解一下如何在实际应用中同时支持ws和wss。

    二. 服务端实现

    1. 数字证书

          为测试方便,我们可以使用 CertificateCreator 制作一个用于本地测试的数字证书。

          运行 CertificateCreator.exe, 然后输入Common Name(比如Test)、密码、保存路径(比如D:\server.pfx),我们就可以得到包含私钥的证书server.pfx 。双击server.pfx ,即可安装证书。 

    2. 服务端引擎设置

           在服务端RapidServerEngine初始化之前,添加如下代码设置其 WssOptions 属性:

            WssOptions wssOptions = new WssOptions( new X509Certificate2("D:\\server.pfx", "password") ,SslProtocols.Default ,false);
            rapidServerEngine.WssOptions = wssOptions;   

            设置完成后,启动服务端。 

    三. 客户端实现

    1. 信任测试用的数字证书      

            由于上述生成的数字证书仅仅是用于测试的,而是不被正式认可的,所以,需要在浏览器设置中,将目标数字证书加入到信任列表。

            比如,在360浏览器中,可如下设置:

              

            在FireFox中,设置如下:

             

              将服务器的地址(https://127.0.0.1:4530)添加到例外中。  

    2. 客户端引擎设置

            打开入门demo的Web端源码中的index.js文件,找到engine的Initialize方法,将 useWss 参数由false修改为true。

            然后将Web端的 index.html 文件拖入浏览器中运行即可。 

    四. 运行效果

           登录一个wss客户端,一个ws客户端和一个.NET客户端,服务端的UI显示如下:

           

            下载 Demo源码 。



    展开全文
  • WebSocket

    2019-09-30 10:14:16
    WebSocket的来历我就不说了本文直入主题:怎么用WebSocket 根据readyState属性可以判断webSocket的连接状态: 0:正在建立连接连接,还...接口路径必须以ws或者wss开头(ws不加密 wss加密) 举个例子: 传统ajax接口:...

    WebSocket的来历我就不说了本文直入主题:怎么用WebSocket

    根据readyState属性可以判断webSocket的连接状态:
    0:正在建立连接连接,还没有完成
    1:连接成功建立,可以进行通信
    2:连接正在进行关闭握手,即将关闭
    3:连接已经关闭或者根本没有建立
     
    接口路径必须以ws或者wss开头(ws不加密 wss加密)
    举个例子:
    传统ajax接口:http://127.0.0.1:8201/eleSubassemblyGroup/list/allTree
    WebSocket接口:ws://127.0.0.1:8201/eleSubassemblyGroup/list/allTree
     
    var ws = new WebSocket("wss://echo.websocket.org"); // 请求数据的接口
    ws.onopen = function(evt) { // 连接建立触发
        console.log("建立连接"); 
        var data = JSON.stringify({ // 要发送的数据(数据类型必须为字符串)
            name: 'tom',
            age: 18,
            sex: true
        })
        ws.send(data);
        console.log('状态:' + ws.readyState);
    };
    
    ws.onmessage = function(evt) { // 服务端返回数据触发
        console.log("服务端返回数据:" + evt.data);
        console.log('状态:' + ws.readyState);
        ws.close(); // 关闭连接
    };
    
    ws.onerror = function(evt) { // 通信发生错误触发
        console.log("发生错误");
        console.log('状态:' + ws.readyState);
    };  
    
    ws.onclose = function(evt) { // 连接关闭触发
        console.log("连接关闭");
        console.log('状态:' + ws.readyState);
    }; 

     

     

    转载于:https://www.cnblogs.com/konghaowei/p/11277365.html

    展开全文
  • 一、Websocket原理(握手、解密、加密)  WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信...
  • websocket

    2018-11-23 11:03:00
    http:socket实现,短连接,请求响应websocket,socket实现,双工通信,请求响应socket创建连接,不断开 原理讲解:socket:客户端:(浏览器)2.先去请求连接,连接服务端(ip和端口)4.客户端发送数据过去,向...
  • WebSocket很好的解决了HTTP的这个缺点,它的特点是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,属于服务器推送技术的一种。特点有 :数据格式轻量,性能开销小,通信高校。可以发送文本或二...
  • WebSocket使用

    2020-11-10 15:28:39
    WebSocket 特点:服务器可以主动想客户端推送信息,客户端也可以... 协议标识符为ws,如果加密是wss,服务器网址就是URL 客户端API WebSocket对象作为一个构造函数,用于创建WebSocket实例 var ws = new WebSocket
  • golang websocket

    2019-12-28 15:13:36
    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间...
  • WebSocket协议

    2020-08-27 17:15:50
    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者...
  • JS实现websocket+mqtt+ssl通信客户端实现

    千次阅读 2017-07-23 21:13:53
    订阅推送就不写了,主要是ssl加密下建立链接,我上网找了好多都没有,最后一个国外网站找到的,忘了网址了。 bmqtt.js用的这个js var KEY = "xxxxx.key"; //加密文件,保证能被访问 var CERT = "xxxx....
  • webSocket用法

    2018-08-15 13:29:10
    在这个项目中我使用的是webSocket这个新的浏览器API.webSocket的目标是在一个单独的持久连接上提供全双工,双向通信。Web Sockets 使用了自定义的协议,所以 URL 模式也略有不同。未加密的连接不再是 http://, 而是...
  • websocket学习

    2018-03-17 15:02:34
    1、简单了解下接口方法和属性: readyState表示连接有四种状态: CONNECTING (0):表示还没建立连接;...url是代表 WebSocket 服务器的网络地址,协议通常是”ws”或“wss(加密通信)”,send 方法就是发送数据到...
  • 握手过程: websocket-client端通过ws协议向websocket-server端发起连接请求前,首先在自己的请求头中添加Sec-Websocket-Key...将该字符串与魔法字符串拼接后先后经过sha1、base64加密后获得与此client端的通信...
  • WebSocket 协议接口测试

    2020-08-14 15:06:40
    1.什么是websocket websocket协议是基于TCP的一种新的网络协议 它实现了客户端与服务器全双工通信,即,允许服务器主动向客户端发送信息 2.websocket VS HTTP http双工通信效率非常低,以前app心跳机制,客户端要...
  • 借助node实战WebSocket

    2017-04-18 16:12:20
    一、WebSocket概述 WebSocket协议,是建立在TCP协议上的,而非...注:ws表示WebSocket协议,wss表示加密WebSocket协议。 WebSocket的好处就是允许服务器和客服端进行实时地互相通信,而不像Ajax那样,
  • websocket的入门使用

    2020-12-07 14:04:18
    (2)websocket 真正的双工通信持久通道,下图是轮训与websocket双工通道的区别 (3)可发送文本或者二进制数据,握手阶段采用http协议,没有同源限制, 协议标识为ws(而非http),加密则为wss eg: websocket的一...
  • WebSocket初步认识

    2020-08-21 19:50:45
    Websocket的最大特点就是,服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送消息。,属于服务器推送技术的一种。(HTTP协议需要轮询询问服务端状态变化) 建立在TCP协议之上,服务器端的实现比较...
  • WebSocket ,通过websocket可以实现浏览器与服务器进行双向通信,浏览器客户端可以给服务端发送数据,服务端能给浏览器客户端发送数据。 我们可以利用这一点让服务端将要加密的参数发送给浏览器客户端,浏览器将...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 127
精华内容 50
关键字:

websocket加密通信