Websockets 在 iOS 和 Safari 上不起作用 - OSStatus 错误 9837
Posted
技术标签:
【中文标题】Websockets 在 iOS 和 Safari 上不起作用 - OSStatus 错误 9837【英文标题】:Websockets not working on iOS and Safari - OSSStatus Error 9837 【发布时间】:2020-10-02 18:33:57 【问题描述】:我正在开发一个使用 socket.io 进行配对的聊天应用程序。使用 Windows 机器和 android 设备的客户端能够建立 websocket 连接。但是,在桌面和 ios 上使用 Safari 的客户端无法同时使用 Safari 和 Chrome 进行连接。我的应用程序从 socket.io 客户端工作 -> nginx 代理 -> Node.js 套接字服务器
我已经能够通过 Mac 检查 iOS 浏览器来追踪错误,并显示此错误 [Error] WebSocket network error: The operation couldn’t be completed. (OSStatus error -9836.)
在对错误进行一些研究后,我发现 Safari 在创建安全的 websocket 连接方面很挑剔。我目前正在使用我的 NGINX 配置中的 CloudFlare 颁发证书和密钥。我也尝试将凭据添加到我的节点服务器,但同样的问题仍然存在。这是 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
);
似乎没有多少人遇到这个问题,所以资源稀少。我的主要猜测可能是 Apple 设备的 ssl 证书格式不正确,但是此配置适用于除 Apple 设备之外的所有其他浏览器。
【问题讨论】:
【参考方案1】:我遇到了同样的问题,并通过另外允许 TLSv1.2 设法修复(或者更确切地说是解决)它 - 所以当前版本的 Safari 中的 websockets 和 TLSv1.3 似乎存在一些问题。
【讨论】:
【参考方案2】:虽然不是生产环境的解决方案,但可以在 Safari 中通过启用实验性功能 NSURLSession WebSocket
来解决此问题。
为此,请转到 Develop > Experimental Features
并确保选中 NSURLSession WebSocket
。
【讨论】:
以上是关于Websockets 在 iOS 和 Safari 上不起作用 - OSStatus 错误 9837的主要内容,如果未能解决你的问题,请参考以下文章