当前位置: 首页 > 知识库问答 >
问题:

如何使用Nginx实现安全的Web套接字连接?

越麒
2023-03-14

我可以通过JavaScript直接将Web套接字连接到我的PHP守护进程服务器:var websocket = new WebSocket(“ws://IP:PORT”);这将正确握手,但是当我尝试nginx代理 http://IP 它无法接收Sec-WebSocket-Key的标头值并且握手失败。

-最近更新:JavaScript根本无法连接,原因是:语法错误:指定了无效或非法的字符串!

nginx config file:

    upstream chatwebsocket {
        server 127.0.0.1:9090;
    }
    server {
       # ...
       listen 80 default_server;
       location / {
          proxy_pass http://chatwebsocket;
          ...
          proxy_set_header Sec-WebSocket-Key      $http_sec_websocket_key;
       } 

变量:$http_sec_websocket_key未设置...为什么?我应该为此使用什么变量?我的PHP聊天服务器没有获得名为: Sec-Webocket-Key的Web套接字标头“Value”。我可以手动将其设置为某个虚拟值:proxy_set_headerSec-WebSocket-Key 13;我的PHP日志文件将显示它的密钥为13。

还有,当我去http://IP我可以在浏览器控制台窗口中检查响应标题。HTTP/1.1 400是一个错误的密钥请求,这是我在PHP中创建的错误,当:注意-$headers被转换为小写并被修剪…并且工作正常。。。

$headers[strtolower(trim($matches[1]))] = trim($matches[2]);
    if (! isset($headers['sec-websocket-key'])) { 
       return "HTTP/1.1 400 Bad Key Request"; //...

为什么?我想做的是,一旦HTTP工作,我想使用HTTPS安全地使用加密形式的WebSocket,同时保持我的网页流量安全

我已经看过这些页面:https://github.com/die-net/nginx-config-example/blob/master/include/proxy-headers和http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header.不知道为什么$http_sec_websocket_key没有得到一个值集…或者用什么变量代替它?

好像是JavaScript问题:var web socket = new web socket(' http://IP ');语法错误:指定了无效或非法的字符串

如何将JavaScript页面连接到Nginx网页代理,可能吗?或者我如何设置服务器来执行wss://IP

还是用PHP中的简单小代码来实现wss套接字?

哈,我现在知道了,这是Nginx配置:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream chatwebsocket {
    server 127.0.0.1:9090;
}

server {
    listen 8020;
    location / {
        proxy_pass http://chatwebsocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

我错过了proxy_set_header**

提升

* * $ http _ upgrade

共有1个答案

公羊宇定
2023-03-14

在JavaScript do中:< code > var web socket = new web socket(' WSS://domain name:443 ');

在Nginx中做:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream appwebsocket {
    server 127.0.0.1:9090;
}

server {
    listen   443;
    server_name YOUR_Domain_Name_HERE;

    ssl  on;
    ssl_certificate  /etc/nginx/ssl/ssl.crt;
    ssl_certificate_key  /etc/nginx/ssl/ssl.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://appwebsocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

进行连接升级是让一切在Nginx中工作的敲门砖。我不需要设置Sec-WebSocket-Key头(在nginx中)!此外,我不需要重写我的PHP应用程序!

请记住,您可以将路径添加到nginx位置路径,这样您就可以保持网页在线并将Web套接字路由到该路径!!

 类似资料:
  • 问题内容: 如何使用正在侦听套接字连接端口的Servlet来实现Web应用程序? 问题答案: 我假设您不是指通过servlet容器免费获得的前门HTTP连接。但是,如果您想添加例如admin服务,则可以创建一个侦听器线程来设置某些全局状态。 servlet。请注意,这不被认为是犹太洁食的(我相信甚至可能违反servlet标准)。

  • 问题内容: 我已经在Linux中使用套接字创建了一个聊天客户端,我希望完全破坏连接。以下是代码的相关部分: 但是close(sock)似乎并没有完全关闭销毁连接,因为进入“标签”之后,代码将退出并显示错误消息 那是连接不再发生。可能是什么问题?提前致谢。 编辑:我真正想要的是,当我在破坏连接后从头开始运行脚本时,它应该作为一个全新程序运行。我该怎么做? 问题答案: 该调用仅将TCP套接字标记为已关

  • 我正在尝试在使用用Python编写的套接字服务器与使用Flutter Web制作的客户端之间建立连接。 我测试了各种套接字包,如adhara_socket_io和flutter_socket_io,但都不起作用。我在Android上尝试了相同的代码片段,但它们也不起作用。 我继续搜索,找到了这个代码片段。它使用包中的类。 这个连接到Python服务器,并从Android发送数据,但当我从Web测试

  • 问题内容: 我目前正在为我教会的大学团体使用一个网站,并且开始对我所写内容的安全性有些担心。例如,我使用以下功能: 每当我进行某种查询时就连接到数据库。我总是使用PDO准备好的语句来防止任何用户输入的SQL注入,并且我使用htmlspecialchars进行转义,然后再输出。我的问题是: 如何保护数据库的用户名和密码? 我不知道是否有人可以查看我的PHP文件的源,但如果可以,我只能想象我会被缠住。

  • 问题内容: 我想使用网络套接字在Laravel中实现网络通知。我尝试过推杆。这很容易,但是它是付费的。我还尝试了redis和socket.io,必须为其安装Horizo​​n。我正在运行Windows,但根据我对地平线的了解,无法在Windows上安装它。 所以我对推送通知非常困惑。我正在尝试至少一个星期,但尚未找到任何解决方案。我的前端在angluar 5 / android中,后端在Larav

  • 问题内容: 我正在使用OpenShift和WildFly 8.2.1 final来实现新的HTML5 websocket。我使用了本教程来设置这个项目。 每当我打开MyTest.html时,这就是JavaScript记录的内容: 服务器连接,然后立即断开连接。为什么?我究竟做错了什么?有什么我想念的吗? 这是模式代码-> serverendpoint.java MyTest.html: 和pom.