自从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显示如下:

服务器ws证书,如何让服务端同时支持WebSocket和SSL加密的WebSocket(即同时支持ws和wss)?...相关推荐

  1. 如何让服务端同时支持WebSocket和SSL加密的WebSocket(即同时支持ws和wss)?

      自从HTML5出来以后,使用WebSocket通信就变得火热起来,基于WebSocket开发的手机APP和手机游戏也越来越多.我的一些开发APP的朋友,开始使用WebSocket通信,后来觉得通信 ...

  2. openssl自签名ca证书,以及签发服务端/客户端证书

    网上由很多,但是感觉操作比较复杂,有些签发的证书不可用.现在介绍简单方法.假设已经安装了openssl,已有sudo权限.已经建立路径:/ope/ca,所有操作都在此路径下进行. 1. 准备工作,由于 ...

  3. 在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳?

    https://www.zhihu.com/question/35013918 在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳? 这个心跳包除了告知服务端我在线,还有其他作用吗?比 ...

  4. 云信服务器代码,云信一键登录服务端API文档-一键登录-网易云信开发文档

    一键登录 > 服务端 API 文档 一键登陆服务端API文档 接口概述 API调用说明 本文档中,所有调用网易云信服务端接口的请求都需要按此规则校验. API checksum校验 以下参数需要 ...

  5. python游戏服务器搭建教程_游戏服务端pomelo安装配置

    游戏服务端pomelo安装配置 一.安装环境 debian 7.0 amd64 二.安装需要的组件 1.安装nodejs 注:debian下nodejs没有相应的apt包,所以无法用apt-get安装 ...

  6. 尝试编辑虚拟磁盘时服务器遇到错误,虚拟磁盘Linux服务端测试及故障处理有哪些呢?...

    1.查看系统负载情况 在服务端命令窗口下执行w命令可得到三组数据(例如 0.40 0.30 1.20),分别为系统前一分钟.前5分钟.前15分钟负载情况,一般负载情况在2以下基本正常,如果长时间高于3 ...

  7. netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果

    netty是一个异步通讯框架,在有的时候咱们想使用服务端向客户端发送消息,服务端同步等待客户端返回结果真进行下一步的业务逻辑操做.那要怎么作才能同步获取客户端返回的数据呢?这里我用到了JDK中的闭锁等 ...

  8. 聊聊WebRTC网关服务器1:如何选择服务端端口方案?

    <聊聊WebRTC网关服务器>系列文章系由WebRTCon2018中网易云信音视频技术专家的分享内容<从零开始构建音视频网关服务器>整理而成,该系列文章将和大家分享网易NRTC ...

  9. 服务器php 启动命令_服务端的cli方式运行

    既然是结合tp5,咱当然要借鉴tp5的优势 # tp5自定义命令行 这个需要自己看tp5的官方文档,直接搜索就能找到,自己添加command.php文件,我的如下 ~~~ /** * Time: 13 ...

最新文章

  1. 移动端打开html控制台,移动端中使用调试控制台 eruda
  2. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)
  3. Linux(RHEL7.0)下安装nginx-1.10.2
  4. 查看安装的cuda和cudnn的版本号
  5. angluar bulid 的时候报错
  6. MySql ORDER BY 索引优化
  7. .NET6之MiniAPI(十七):缓存
  8. 网页撤销后ubuntu本地撤销
  9. 设计模式学习之---Adapter(适配器)模式
  10. 谷歌云盘Colab使用心得
  11. 基于Matlab的车型识别(GUI界面)
  12. linux安装bin文件命令,Ubuntu下bin文件的安装
  13. 自相关函数 互相关函数 平稳随机过程
  14. 初中毕业也能月薪过万!5个质量极高的教程网站,免费献给你
  15. html怎么设置下外边距,cssmargin外边距属性与用法总结
  16. python爬取公众号文章数据库,爬取微信公众号所有文章的请教
  17. 事务机制:Redis能实现ACID属性吗?
  18. 生僻字用计算机来,二级office必备,生僻字也可以一体化注音
  19. mimic-iii数据库说明-01数据库介绍
  20. Simscape Multibody Contact Forces Libray

热门文章

  1. 腾讯回应微信刷掌支付;iPhone 13 Pro或提供1TB版本;Git 2.33 发布|极客头条
  2. django+boostrap项目部署在IIS上出现找不到woff2文件404错误
  3. 英伟达宣布,《堡垒之夜》重返苹果iOS平台
  4. 解决RTX3090显卡linux系统无法正常安装apex的问题
  5. U盘恢复出厂 (使用U盘装机大师
  6. 起飞,年薪70万+ 5月字节Android高工岗4面上岸
  7. 被樊登老师转发朋友圈的论语打卡(100万份打卡中唯一)
  8. Unity 拓展功能之 Hierarchy面板右侧小图标功能
  9. iOS开源加密相册Agony的实现(七)
  10. python的实现原理_python爬虫实现原理