websocketpp wss
一. wss 认证
关于SSL认证说明(转载)
https://www.cnblogs.com/bluestorm/p/10571989.html
二.从浏览器生成wss客户端
1.用谷歌打开网站
2.点击"小锁", 在证书路径中所有的证书都需要生成*.pem。
3.导出证书
选择第一级证书,点击查看证书
>>详细信息
>>复制到文件
>>下一步
>>选择DER 编码二进制X.509(.CER)
>>下一步
>>指定导出文件路径文件名(可直接导出到openssl的bin目录下),完成证书导出(文件后缀.cer)。
4.生成 .pem 文件
使用 openssl.exe 将证书文件转为.pem 文件,命令如下
openssl x509 -in xxx.cer -inform der -out xxx.pem
重复 2 3 4
步骤依次将各级证书,全部生成对应的.pem
文件。然后将各个.pem
文件的内容copy到同一个.pem
文件内(如client.pem)。
websocketpp/examples/print_client_tls/print_client_tls.cpp测试只生成一级目录证书,即可连接成功
5. websockets
- websockets默认端口 443
- 地址格式: wss://ip地址:443
三.websocketpp的wss client demo
修改 websocketpp/examples/print_client_tls/print_client_tls.cpp内容
/// Verify that one of the subject alternative names matches the given hostname
bool verify_subject_alternative_name(const char * hostname, X509 * cert)
{STACK_OF(GENERAL_NAME) * san_names = NULL;san_names = (STACK_OF(GENERAL_NAME) *) X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);if (san_names == NULL) {return false;}int san_names_count = sk_GENERAL_NAME_num(san_names);bool result = false;for (int i = 0; i < san_names_count; i++) {const GENERAL_NAME * current_name = sk_GENERAL_NAME_value(san_names, i);if (current_name->type != GEN_DNS) {continue;}char * dns_name = (char *) ASN1_STRING_data(current_name->d.dNSName);// Make sure there isn't an embedded NUL character in the DNS nameif ((size_t)ASN1_STRING_length(current_name->d.dNSName) != strlen(dns_name)) {break;}// Compare expected hostname with the CNresult = (strcasecmp(hostname, dns_name) == 0);}sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free);return result;
}/// Verify that the certificate common name matches the given hostname
bool verify_common_name(const char * hostname, X509 * cert)
{// Find the position of the CN field in the Subject field of the certificateint common_name_loc = X509_NAME_get_index_by_NID(X509_get_subject_name(cert), NID_commonName, -1);if (common_name_loc < 0) {return false;}// Extract the CN fieldX509_NAME_ENTRY * common_name_entry = X509_NAME_get_entry(X509_get_subject_name(cert), common_name_loc);if (common_name_entry == NULL) {return false;}// Convert the CN field to a C stringASN1_STRING * common_name_asn1 = X509_NAME_ENTRY_get_data(common_name_entry);if (common_name_asn1 == NULL) {return false;}char * common_name_str = (char *) ASN1_STRING_data(common_name_asn1);// Make sure there isn't an embedded NUL character in the CNif ((size_t)ASN1_STRING_length(common_name_asn1) != strlen(common_name_str)) {return false;}// Compare expected hostname with the CNreturn (strcasecmp(hostname, common_name_str) == 0);
}bool verify_certificate(const char * hostname, bool preverified, boost::asio::ssl::verify_context& ctx)
{int depth = X509_STORE_CTX_get_error_depth(ctx.native_handle());if (depth == 0 && preverified) {X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());if (verify_subject_alternative_name(hostname, cert)) {return true;} else if (verify_common_name(hostname, cert)) {return true;} else {return false;}}return preverified;
}context_ptr on_tls_init(const char * hostname, websocketpp::connection_hdl) {context_ptr ctx = websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23); try {ctx->set_options(boost::asio::ssl::context::default_workarounds |boost::asio::ssl::context::no_sslv2 |boost::asio::ssl::context::no_sslv3 |boost::asio::ssl::context::single_dh_use);// 注意此处:set_verify_mode// 选择 verify_peer 需要 load_verify_file// 选择 verify_none 不需要 load_verify_filectx->set_verify_mode(boost::asio::ssl::verify_peer);ctx->set_verify_callback(bind(&Mverify_certificate, hostname, ::_1, ::_2));// Here we load the CA certificates of all CA's that this client trusts.ctx->load_verify_file("client.pem");} catch (std::exception& e) {std::cout << e.what() << std::endl;}return ctx;
}
websocketpp wss相关推荐
- Websocket服务端和客户端通信(WSS、WS)
前端和后端之间的通讯 一.简介 前端为客户端(Client),后端为服务端(Server) 具体操作步骤为: 1.运行 Server 目录下的 --> WebsocketServerWss_Ws ...
- WSS 代码执行的权限提升
WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码,也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问.在大多数情况下,这种机制能够准确并严格地控制了标准权 ...
- R语言层次聚类:通过内平方和WSS选择最优的聚类K值、可视化不同K下的BSS和WSS、通过Calinski-Harabasz指数(准则)与聚类簇个数的关系获取最优聚类簇的个数
R语言层次聚类:通过内平方和(Within Sum of Squares,WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法ÿ
- R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数
通过内平方和(Within Sum of Squares, WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最佳的聚类个数 目录
- 搭建WSS 开发测试环境
这次再次整理了一下针对WSS 3.0开发测试环境的步骤.以前我们主要针对MOSS去做开发. 1.安装Windows Server 2003 ,安装必要的补丁包 2.安装SQL Server 2005( ...
- [MOSS开发]:WSS v3授权
众所周知,MOSS是应用在WSS基础上的,所有针对MOSS开发难免要对WSS要有所了解,精通当然最好.在此B/S架构的软件中,权限是非常重要的一部分,在MOSS中也是如此.在MOSS中,管理权限完成是 ...
- 利用WSS搭建学生作业平台
这是我以前写过的一个文档,现在与大家分享下: 我们将需要以下几点步骤: l 部署相应的环境 l 在WSS服务器上创建相应的网站并添加相应功能模块 l 创建相应的管理人员与用户并赋予相应的权限 l 测试 ...
- websocketpp 打印发送数据
websocketpp 发送流媒体数据,一直打印二进制数据,控制台无法查看了. 解决方法: m_server.set_access_channels(websocketpp::log::alevel: ...
- websocketpp 只发送一次
websocketpp 发送avpacket,不停的打印数据日志,只能发一次. 最后解决方法: m_server.set_access_channels(websocketpp::log::aleve ...
最新文章
- python 线性回归_用Python实现线性回归算法
- 深度睡眠中,记忆如何被保持?
- JavaScript(JS)之简单介绍
- 【Linux系统编程】线程池
- spring 七种事务
- php生成不重复时间戳,PHP获取时间戳和微秒数以及生成唯一ID
- 过磅系统更换服务器,无人值守过磅系统改造方案
- videojs 卡顿_流媒体技术学习笔记之(四)解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了...
- c++时间片轮转rr进程调度算法_进程,线程基础(—)
- java代码颜色_JAVA颜色代码
- 网管工具之cacti
- 如何查看android应用签名信息
- kinect v2 相机标定
- 抖音快手初学者如何快速成长
- Ubuntu16.04下cuda9.0+cudnn7.0安装指南
- 整数:求数组Nums中只出现一次的数
- 大学计算机基础实验实施,大学计算机基础实验实施的方案学生用.docx
- 用python的sympy解符号方程组
- CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念及 Chelsio T5 产品介绍
- 表白代码制作(附源码)