当前位置:   article > 正文

WSS服务端接入过程记录_wss在线连接

wss在线连接

        公司游戏需要搞个微信小程序版,然后小程序需要用wss协议,即webSocket+ssl,所以记录一下(踩坑的)过程,方便看到这篇文章的人(虽然已经是超过半年以前的事情,实际上老大来问我的时候已经快忘光了,找点时间记录下来免得下次继续忘)

目录

一、C++实现webSocket升级

二、ssl实现(通过nginx代理)


一、C++实现webSocket升级

        首先,webSocket是什么?其实就是一个协议,要求数据按照这个协议的规则来进行发放。关于ws的东西网上一搜一大把,这里就不再赘述,有兴趣的可以自己去看一下,这里推荐http - WebSocket 详解 - 不挑食的程序员 - SegmentFault 思否https://segmentfault.com/a/1190000012948613

写得很详细

        然后这里有大佬造的简易轮子,可惜没用上(76条消息) C++实现WebSocket功能及WebSocket协议详解(附代码)_c websocket_贝松的博客-CSDN博客https://blog.csdn.net/qq_39540028/article/details/104493049

        首先,相信看这篇文章的都是有升级wss协议需求的,而不是从头开始构建链接,所以就不说那些了,直接从ws开始。ws其实就握手保证一下链接真实可靠,然后通过这个链接双方互相传输消息,最后交换完消息就挥手关掉链接。具体是怎么实现的呢?

        首先,在http的基础下,客户端会向服务端提出升级协议,这时候是明文请求的

  1. GET / HTTP/1.1
  2. Host: localhost:8080
  3. Origin: http://127.0.0.1:3000
  4. Connection: Upgrade
  5. Upgrade: websocket
  6. Sec-WebSocket-Version: 13
  7. Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==

        实际上这里要关心的是两个点,一个是开头的GET,一个是最后的Sec-WebSocket-Key。因为对我实际做的项目来说,需求是能支持同一个服务器接收来自不同客户端的消息,也就是说支持小程序和普通app的混服,而我们自己本身是用的自用协议,所以在客户端开始握手的时候要判断到底是来自于哪里的消息、接下来采用哪种协议去进行通讯。于是乎就直接判断握手消息是否GET开头,是的话后面开始走WS逻辑,否则走我们原来的自用协议。当然假如你有严格要求,或者怕和正在使用的其他协议发生混淆,全部消息检查一遍也是没问题的,上面是ws的 RFC2616的规定,没啥好说的。

        而Sec-WebSocket-Key,这是客户端要求服务端做的一个验证,需要在这串东西后面拼接上258EAFA5-E914-47DA-95CA-C5AB0DC85B11这样一个协议约定的字符串,然后把拼接好的内容先sha1算出来一个哈希值,然后将这个哈希值转成base64字符串,到时候回包能用到。这么做主要是为了向客户端保证自己的确收到了这样一个消息,并且针对这个消息做出回复,保证双方不会被偶然链接影响。

        好了,收到客户端ws的请求,现在要回复了。

  1. HTTP/1.1 101 Switching Protocols
  2. Connection:Upgrade
  3. Upgrade: websocket
  4. Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

        除了Accept以外的东西实际使用没啥好关心的,照样发出去就行了。

二、ssl实现(通过nginx代理)

        nginx代理其实就是用nginx中转,让前端只向nginx对外端口发消息,nginx处理之后将数据按指定规则发给后端,这里的处理其实也可以包括ssl握手与加密,将前端发过来的WSS处理成WS包,后端只要专心解WS包就好了。

        SSL需要一个证书支持,所谓的证书其实就是一个身份证证明你是你自己。假如是用阿里云之类的服务器的,去申请一个自己对应域名的证书就好了,关于证书的部分可以跳过。但是假如是自机测试调试的话,就需要自己弄一个证书给nginx了。

        首先要注意一点,wss访问是访问域名的,而证书也是对域名进行认证的。自己本机上调试的怎么办?改个host自己弄个域名就好。C:\Windows\System32\drivers\etc这个路径,或者你是linux的话就etc/hosts,加个

127.0.0.1       test.game.net

将test.game.net定向到本机ip上,当然你自己改个域名也行,不过下面的步骤都要自己跟着改。

        域名弄好之后,下个openssl证书开搞,具体可以查看(88条消息) 关于Nginx配置SSL证书(Https)和WebSocket的wss_wss证书_Shiro to kuro的博客-CSDN博客

        记得两个点:

        1.nginx域名填刚刚host里面改的域名

        2.做证书的时候Common Name一定要填那个域名!

        给一下我的conf

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. # '$status $body_bytes_sent "$http_referer" '
  15. # '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. server {
  23. listen 80;
  24. server_name test.game.net;
  25. #charset koi8-r;
  26. #access_log logs/host.access.log main;
  27. location / {
  28. root html;
  29. index index.html index.htm;
  30. }
  31. #error_page 404 /404.html;
  32. # redirect server error pages to the static page /50x.html
  33. #
  34. error_page 500 502 503 504 /50x.html;
  35. location = /50x.html {
  36. root html;
  37. }
  38. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  39. #
  40. #location ~ \.php$ {
  41. # proxy_pass http://127.0.0.1;
  42. #}
  43. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  44. #
  45. #location ~ \.php$ {
  46. # root html;
  47. # fastcgi_pass 127.0.0.1:9000;
  48. # fastcgi_index index.php;
  49. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  50. # include fastcgi_params;
  51. #}
  52. # deny access to .htaccess files, if Apache's document root
  53. # concurs with nginx's one
  54. #
  55. #location ~ /\.ht {
  56. # deny all;
  57. #}
  58. }
  59. # another virtual host using mix of IP-, name-, and port-based configuration
  60. #
  61. #server {
  62. # listen 8000;
  63. # listen somename:8080;
  64. # server_name somename alias another.alias;
  65. # location / {
  66. # root html;
  67. # index index.html index.htm;
  68. # }
  69. #}
  70. map $http_upgrade $connection_upgrade {
  71. default upgrade;
  72. '' close;
  73. }
  74. # HTTPS server
  75. #
  76. server {
  77. listen 443 ssl;
  78. server_name test.game.net;
  79. ssl_certificate ../keys/server.pem;
  80. ssl_certificate_key ../keys/server.key;
  81. ssl_session_timeout 5m;
  82. ssl_session_cache shared:SSL:10m;
  83. ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
  84. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  85. ssl_prefer_server_ciphers on;
  86. ssl_verify_client off;
  87. #location / {
  88. # root html;
  89. # index index.html index.htm;
  90. #}
  91. location /{
  92. proxy_redirect off;
  93. proxy_pass http://本机IP:想要转发的端口/;
  94. proxy_set_header Host $host;
  95. proxy_set_header X-Real_IP $remote_addr;
  96. proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
  97. proxy_http_version 1.1;
  98. proxy_set_header Upgrade $http_upgrade;
  99. proxy_set_header Connection upgrade;
  100. }
  101. }
  102. }

        上面最重要的是HTTPS的部分,内容其实就是监听443接口,认为传入的是ssl加密后信息,转发到你自己ip和端口上,然后让你自己的服务端去监听这个端口。

        nginx搭起来了,就可以用在线工具测一下了

        WebSocket在线测试工具 (wstool.js.org)

        只不过浏览器搞的话,因为你的证书是自己当CA签的,浏览器不会认,要先让浏览器放行你的证书。具体操作方法就是开了nginx之后,浏览器上一下监听的域名,然后应该会说网站证书不安全之类的,点一下把你的自签证书加入可信。不然的话用上面的在线工具会报错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/164672
推荐阅读
相关标签
  

闽ICP备14008679号