ios - Websockets 在 iOS 和 Safari 上不起作用 - OSSStatus 错误 9837

标签 ios ssl websocket socket.io safari

我正在开发一个使用 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.) enter image description here

在对错误进行一些研究后,我发现 Safari 在创建安全的 websocket 连接时很挑剔。我目前正在使用我的 NGINX 配置中的 CloudFlare 颁发证书和 key 。我也尝试将凭据添加到我的节点服务器,但同样的问题仍然存在。这是 NGINX 服务器 block :

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 设备之外的所有其他浏览器。

最佳答案

我遇到了同样的问题,并设法通过另外允许 TLSv1.2 来修复(或者更确切地说是解决)它 - 所以在当前版本的 Safari 中似乎存在 websockets 和 TLSv1.3 的问题。

关于ios - Websockets 在 iOS 和 Safari 上不起作用 - OSSStatus 错误 9837,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62352790/

相关文章:

python - 制作小 'Connect to a SSL webpage' 脚本的最快语言

Python websocket 连接并监听传入消息

java - 从 Play 2.4.1 迁移到 2.5.6 - 套接字

ios - 在 swift 中读取并保存在数组中设置数组

ios - 如何从磁盘加载 plist 文件作为 iOS 上的 NSDictionary?

子目录的 Apache SSL 重定向删除斜杠

websocket - Ratchet WAMP onpublish 总是发布到所有客户端,包括发布调用者与否?

ios - TableView Controller 代码未被调用

iOS:在特定时间播放音频文件并在特定持续时间后停止

.htaccess - 为子域强制使用 .htaccess 的 SSL 和 WWW