一. 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相关推荐

  1. Websocket服务端和客户端通信(WSS、WS)

    前端和后端之间的通讯 一.简介 前端为客户端(Client),后端为服务端(Server) 具体操作步骤为: 1.运行 Server 目录下的 --> WebsocketServerWss_Ws ...

  2. WSS 代码执行的权限提升

    WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码,也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问.在大多数情况下,这种机制能够准确并严格地控制了标准权 ...

  3. R语言层次聚类:通过内平方和WSS选择最优的聚类K值、可视化不同K下的BSS和WSS、通过Calinski-Harabasz指数(准则)与聚类簇个数的关系获取最优聚类簇的个数

    R语言层次聚类:通过内平方和(Within Sum of Squares,WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法ÿ

  4. R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数

    通过内平方和(Within Sum of Squares, WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最佳的聚类个数 目录

  5. 搭建WSS 开发测试环境

    这次再次整理了一下针对WSS 3.0开发测试环境的步骤.以前我们主要针对MOSS去做开发. 1.安装Windows Server 2003 ,安装必要的补丁包 2.安装SQL Server 2005( ...

  6. [MOSS开发]:WSS v3授权

    众所周知,MOSS是应用在WSS基础上的,所有针对MOSS开发难免要对WSS要有所了解,精通当然最好.在此B/S架构的软件中,权限是非常重要的一部分,在MOSS中也是如此.在MOSS中,管理权限完成是 ...

  7. 利用WSS搭建学生作业平台

    这是我以前写过的一个文档,现在与大家分享下: 我们将需要以下几点步骤: l 部署相应的环境 l 在WSS服务器上创建相应的网站并添加相应功能模块 l 创建相应的管理人员与用户并赋予相应的权限 l 测试 ...

  8. websocketpp 打印发送数据

    websocketpp 发送流媒体数据,一直打印二进制数据,控制台无法查看了. 解决方法: m_server.set_access_channels(websocketpp::log::alevel: ...

  9. websocketpp 只发送一次

    websocketpp 发送avpacket,不停的打印数据日志,只能发一次. 最后解决方法: m_server.set_access_channels(websocketpp::log::aleve ...

最新文章

  1. python 线性回归_用Python实现线性回归算法
  2. 深度睡眠中,记忆如何被保持?
  3. JavaScript(JS)之简单介绍
  4. 【Linux系统编程】线程池
  5. spring 七种事务
  6. php生成不重复时间戳,PHP获取时间戳和微秒数以及生成唯一ID
  7. 过磅系统更换服务器,无人值守过磅系统改造方案
  8. videojs 卡顿_流媒体技术学习笔记之(四)解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了...
  9. c++时间片轮转rr进程调度算法_进程,线程基础(—)
  10. java代码颜色_JAVA颜色代码
  11. 网管工具之cacti
  12. 如何查看android应用签名信息
  13. kinect v2 相机标定
  14. 抖音快手初学者如何快速成长
  15. Ubuntu16.04下cuda9.0+cudnn7.0安装指南
  16. 整数:求数组Nums中只出现一次的数
  17. 大学计算机基础实验实施,大学计算机基础实验实施的方案学生用.docx
  18. 用python的sympy解符号方程组
  19. CNA, FCoE, TOE, RDMA, iWARP, iSCSI等概念及 Chelsio T5 产品介绍
  20. 表白代码制作(附源码)

热门文章

  1. webpack 降级
  2. 中国Linux与微软斗法北京谋变,从水火不容到共生(转)
  3. 苏州Uber人民优步奖励政策
  4. B站离线多机房架构实践
  5. 全球与中国PH和ORP通用分析仪市场深度研究分析报告
  6. 1_初步了解和试运行
  7. Python diag函数
  8. 微积分基础知识note
  9. 基于分布式CPU计算的Deeplearning4j迁移学习应用实例
  10. sklearn preprocessing PolynomialFeatures 用法