首页 > 其他分享 >使用libwebsocket技术总结

使用libwebsocket技术总结

时间:2025-01-18 12:00:16浏览次数:3  
标签:总结 openssl WebSocket 技术 libwebsocket server 编译 Sec key

一、编译libwebsocket

1) 需要使用Cmake工具,将根目录下CMakeLists.txt打开后,需要配置openssl库的路径

2) 当前libwebsocket v3.2版本需要使用openssl v1.1.x以上版本,否则ssl安全协议支持只能选择内置ssl模块,一般都选择openssl库作为ssl加密库。

3) Openssl 库的版本问题

当前终端安全登录产品中使用Openssl v0.9.8k加密通信。该库编译后的目标库为libeay32.dll、ssleay32.dll。经过perl config后,在子目录ms下形成两个nasm.mak文件。

Libwebsocket库使用Openssl v1.1.x支持ssl加密通信。该库编译后的目标库名为libssl、libCrypto,而且编译方法有差异。

编译时指定CFLAG =/MT, 编译依赖标准c运行时,减少对vc运行时依赖。

Libwebsocket支持的协议,包括http1.1、http2.0,支持ssl安全通信。

二、安全websocket

1) 使用openssl产生自签名证书

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj "/CN=localhost"
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

或者

openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout self.key.pem -out self-x509.crt -subj "/C=CN/CN=localhost"

2) 编译测试工程

编译minimal-examples\ ws-server\minimal-ws-server,需要创建vc控制台工程项目,并引用websocket.dll动态库,使用/MT编译选项,编译为动态库。

编译时依赖库包括:ws2_32.lib;userenv.lib;psapi.lib;iphlpapi.lib;advapi32.lib。

可在lws_context_creation_info中指定自己创建的证书、私钥文件路径。

info.ssl_cert_filepath = "self-x509.crt";
info.ssl_private_key_filepath = "self.key.pem";

3) 安全wss协议测试的浏览器环境

无论谷歌、火狐浏览器,都需要先设置ssl安全例外,添加可信任的服务证书。

4) Google浏览器

直接运行测试例子可以正常收发。通过调试器查看到第一个通信过程是

  Request URL: wss://localhost:8443/
Request Method: GET
Status Code: 101 Switching Protocols

HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: 7qZ3iyz7fpBsH5sgrNhFwZcSfFg=
Sec-WebSocket-Protocol: lws-minimal

GET wss://localhost:8443/ HTTP/1.1
Host: localhost:8443
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Upgrade: websocket
Origin: https://localhost:8443
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Sec-WebSocket-Key: m+k1azZCRrWV+Mpj9Q0klw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: lws-minimal  

5) Firefox浏览器

需要先配置浏览器(由于使用高版本采用了SPDY协议,包括http 2.0多路复用功能),在浏览器地址栏输入about:config,搜索websocket。设置项如下

也有网上资料说可以开启 network.websocket,应为低版本火狐中的配置项。高版本中(FF v71)已无该选项。

network.http.spdy.websockets,如果不禁用,会导致libwebsocket无法建立wss连接。SPDY协议是http 2.0中多路复用功能,如果浏览器一直使用http2.0,则需要关闭该功能,如果使用http 1.1通信,则该功能是不启用的。

network.websocket.allowInsecureFromHTTPS,主要用于在http网页中发起wss连接。相反,也有在https网页中发起ws连接,也有响应配置项。

配置完成后,Firefox浏览器运行测试例子可以正常收发。通过调试器查看到通信过程

HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: tqw6pb9N25Dl6lHXPSnbDlOMIyU=
Sec-WebSocket-Protocol: lws-minimal

Host: localhost:8443
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: https://localhost:8443
Sec-WebSocket-Protocol: lws-minimal
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: C2AMP6WJRQk8OgSPFMphIQ==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

标签:总结,openssl,WebSocket,技术,libwebsocket,server,编译,Sec,key
From: https://blog.csdn.net/qq_54089476/article/details/145224749

相关文章

  • 日期时间格式化:DateTimeFormatter (全面总结和详细拆解)
    前言:小编吃了点药药,终于流感要好啦(嘻嘻)我们继续日更吧!!!我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,为什么用这串代码关键字,对比同类型的代码,让大家真正看完以后融会贯通,举一反三,实践应用!!!!①官方定义......
  • 嵌入式知识点总结(一)-C/C++关键字
     针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。目录1.C语言宏中"#“和"##"的用法1.1.(#)字符串化操作符1.2.(##)符号连接操作符2.关键字volatile有什么含意?并举出三个不同的例子?2.1.并行设备的硬件寄存器2.2.中断服务程序中修改的变......
  • 内存管理优化技术:写时复制(Copy-On-Write, COW)
    文章目录说明写时复制(Copy-On-Write,COW)概念一写时复制的工作原理二为什么需要写时复制三COW在fork()中的应用四COW的优势五COW的应用场景六COW的局限性和挑战七总结说明本文是针对个人专业知识查缺补漏,结合大模型对话内容整理而来,请辩证看待文章!写时......
  • 【华为OD技术面试手撕真题】- C++手撕技术面试八股文(3)
    文章目录一、常见的STL容器有哪些?1、序列容器2、关联容器3、无序关联容器4、容器适配器二、STL中map和set的原理1、基本数据结构(红黑树)2、map3、set4、特点和应用三、深拷贝和浅拷贝的区别1、浅拷贝2、深拷贝四、什么情况下会调用拷贝构造函......
  • 【华为OD技术面试手撕真题】- C++手撕技术面试八股文(2)
    文章目录一、struct结构体和共同体union共同体的区别1、内存分配2、成员访问3、使用场景4、定义方式5、总结二、堆和栈的区别1、内存分配方式2、生命周期3、大小限制4、内存访问速度5、数据存储6、多线程的影响三、什么是内存泄漏?面对内存泄漏和......
  • 1.17学习总结
    排序a.桶排序  b.快速排序  算法分析   洛谷作业题×1数据结构:复习了结构体,指针,typedef ......
  • STL容器封装常见问题分析解决方法总结
    一、问题简介    在C++的开发工作中,经常会将STL的标准容器进行一层封装,以满足更高级的需求,如支持外部内存等。在封装容器时,容易出现问题的地方包括容器的元素运算符以及容器的内存分配器,本人在做相关的工作时,将上述两方面所遇到问题的分析解决方法进行了如下总结。二、问......
  • 大一计算机的自学总结:二叉树三种序的非递归遍历
    前言二叉树的递归遍历在我上一篇“二叉树及其三种序的递归遍历”里有。其中用到的“BinaryTree”也在链接文章的“二叉树的创建”里。大一计算机的自学总结:二叉树及其三种序的递归遍历而非递归遍历是借助栈的特性,会更难更复杂。TvT......一、先序遍历#include<bits/stdc++.......
  • 电传飞控技术漫谈
    文章目录一、电传飞控基本概念二、eVTOL飞控设计中的简化飞行操纵(SVO)概念三、分布式和分层的飞控设计理念一、电传飞控基本概念电传飞控(Fly-By-Wire,FBW)是一种先进的飞机飞行控制技术概念,在现代航空领域具有极其重要的地位。在传统的飞机飞行控制系统中,飞行员的操......
  • 【点乒的超级无敌C++总结】
    C的面向过程:想法就是运行高效,版本更新擦除重来C++的面向对象:封装:概况提炼属性有一些被隐藏有一些可以通过公有的方式查看修改(不太准)继承:父类把属性复制一份给子类用多态:多种形态(函数调用可以有多种的执行内容)什么是类?具有相同的属性方法的个体的抽象什么是构造函......