WebSocket无法在iOS和Safari上运行-OSStatus错误9837

WebSocket无法在iOS和Safari上运行-OSStatus错误9837,ios,ssl,websocket,socket.io,safari,Ios,Ssl,Websocket,Socket.io,Safari,我正在开发一个聊天应用程序,它使用socket.io进行配对。使用Windows机器和Android设备的客户端可以建立websocket连接。但是,在桌面和iOS上使用Safari的客户端无法同时使用Safari和Chrome进行连接。我的应用程序在socket.io客户端->NGINX代理->Node.js套接字服务器上运行 我已经能够通过Mac检查iOS浏览器来跟踪错误,该错误显示为[error]WebSocket网络错误:操作无法完成。(OSStatus错误-9836。) 在对错误进行

我正在开发一个聊天应用程序,它使用socket.io进行配对。使用Windows机器和Android设备的客户端可以建立websocket连接。但是,在桌面和iOS上使用Safari的客户端无法同时使用Safari和Chrome进行连接。我的应用程序在socket.io客户端->NGINX代理->Node.js套接字服务器上运行

我已经能够通过Mac检查iOS浏览器来跟踪错误,该错误显示为
[error]WebSocket网络错误:操作无法完成。(OSStatus错误-9836。)

在对错误进行了一些研究之后,我发现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
  } 
}
以下是如何在客户端定义套接字连接:

<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://*;">


似乎并不是很多人遇到这个问题,所以资源是稀缺的。我的主要猜测可能是苹果设备的ssl证书格式不正确,但是此配置适用于除苹果设备以外的所有其他浏览器。

我也遇到了同样的问题,并设法解决了(或者说解决了)它是通过另外允许TLSv1.2实现的-因此,当前版本的Safari中WebSocket和TLSv1.3似乎存在一些问题。

虽然不是生产环境的解决方案,但这可以通过在Safari中启用实验功能
NSURLSession WebSocket
来解决。 要执行此操作,请转到
developer>Experimental Features
,并确保选中了
nsursession WebSocket

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