Websockets在iOS和Safari上无法工作 - OSSStatus错误9837。

13

我正在开发一个聊天应用程序,使用socket.io进行匹配。使用Windows机器和Android设备的客户端能够建立websocket连接。然而,在桌面Safari和iOS上使用Safari和Chrome的客户端无法连接。我的应用程序从socket.io客户端-> NGINX代理 -> Node.js socket服务器中工作。

我通过在Mac上检查iOS浏览器来追踪错误,发现了这个错误[Error] WebSocket网络错误:操作无法完成。(OSStatus error -9836。) enter image description here

经过一些对错误的研究,我发现Safari在创建安全的websocket连接时比较挑剔。我目前正在使用CloudFlare颁发的证书和密钥,并将其添加到我的NGINX配置中。我还尝试将凭据添加到我的节点服务器中,但问题仍然存在。这是NGINX服务器块:

server {
  listen 80;
  listen 443;

  ssl                   on;
  ssl_certificate       /var/site-certificates/website.com/cloudflare.website.com.pem;
  ssl_certificate_key   /var/site-certificates/website.com/cloudflare.website.com.key;
  ssl_protocols TLSv1.3;

  server_name chat0.website.com;

  location / {
    proxy_http_version 1.1;
    # proxy_ssl_certificate     /var/site-certificates/website.com/cloudflare.website.com.pem; //tried with and without, same result
    # proxy_ssl_certificate_key /var/site-certificates/website.com/cloudflare.website.com.key;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Real-IP $remote_addr ; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; 
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:5555; //tried https with credentials but same result
  } 
}

以下是客户端定义Socket连接的方法:

<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<meta http-equiv="Content-Security-Policy" content="default-src ... connect-src 'self' * ws://* wss://*;">


SocketConn = io.connect(socket_endpoint, {
                    forceNew: false,
                    transports: ['websocket'],
                    reconnection: true,
                    reconnectionDelay: 2000,
                    reconnectionDelayMax: 5000,
                    reconnectionAttempts: 10
                });

看起来并不是很多人遇到这个问题,因此资源很少。我的主要猜测可能是苹果设备的 SSL 证书格式不正确,但是这个配置适用于除苹果设备之外的所有其他浏览器。

2个回答

14

我曾经有同样的问题,并通过允许TLSv1.2(或者更精确地说是解决)来解决它 - 因此,在当前版本的Safari中,Websockets和TLSv1.3存在某些问题。


10

对于生产环境而言,这并不是一个解决方案,但是在Safari中可以通过启用实验性特性NSURLSession WebSocket来解决问题。 要执行此操作,请转到开发 > 实验性特性,并确保已选中NSURLSession WebSocket


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接