概述
因为需要在windows上开发一个本地服务,供浏览器的页面通过websockets访问。故选择开源项目libwebsockets。该项目官网官网:https://libwebsockets.org/ 源码托管地址:https://github.com/warmcat/libwebsockets.git
编译
因为需要在windows平台编译,所以需要安装CMake。cmake能够生成VS工程,然后自行编译VS工程即可。这个需要注意的是生成的VS工程不要修改编译选项,如果确实需要修改,请修改cmake的配置文件,然后重新用cmake生成VS工程。
cmake生成vs工程时,需要指定vs的版本,目前主要版本如下:
- Visual Studio 16 2019
- Visual Studio 15 2017
- Visual Studio 14 2015
- Visual Studio 12 2013
这里最好选择和libwebsockets的使用方一致,以便运行库的一致性。
禁用ssl编译
使用命令:
cmake -DLWS_WITH_SSL=0 -DLWS_WITH_ZIP_FOPS=0 ./ -G "Visual Studio 16 2019"
这个创建的只能使用http://和ws://等协议,不能使用https://和wss://等协议。
启用ssl编译
cmake -DLWS_WITH_SSL=1 -DLWS_WITH_ZIP_FOPS=0 ./ -G "Visual Studio 16 2019"
这个好处是支持https://等协议,不好的地方是要引入第三方的ssl库(请自行选择)。
我选择的是openssl,使用的方式是
设置全局环境变量OPENSSL_ROOT_DIR,值为OPENSSL完整编译输出目录(bin目录的父目录)。openssl的输出有编译器的区分。
SSL使用问题
cmake命令完成后,会自动生成一个自签名的locahost证书。
使用这个证书部署服务器,浏览器可能不认。(原因是这个证书不受信呀,简单的解决方法是,使用电脑加入受信)
我使用的方式是使用letsencrypt的签名证书。使用该库的代码上需要设置:
1. lws_context_creation_info::ssl_cert_filepath使用fullchain.pem
2. lws_context_creation_info::ssl_private_key_filepath使用privkey.pem
3. lws_context_creation_info::ssl_ca_filepath不需要指定
4. lws_context_creation_info::options需要添加LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT标志(用异或的位运算方法,如|=)
5. lws_context_creation_info::ssl_cipher_list的参考为
"ECDHE-ECDSA-AES256-GCM-SHA384:"
"ECDHE-RSA-AES256-GCM-SHA384:"
"DHE-RSA-AES256-GCM-SHA384:"
"ECDHE-RSA-AES256-SHA384:"
"HIGH:!aNULL:!eNULL:!EXPORT:"
"!DES:!MD5:!PSK:!RC4:!HMAC_SHA1:"
"!SHA1:!DHE-RSA-AES128-GCM-SHA256:"
"!DHE-RSA-AES128-SHA256:"
"!AES128-GCM-SHA256:"
"!AES128-SHA256:"
"!DHE-RSA-AES256-SHA256:"
"!AES256-GCM-SHA384:"
"!AES256-SHA256"