iOS Safari 无法连接到安全的 websocket,但可以在桌面上运行

标签 ios node.js ssl websocket safari

我有一个使用自签名证书的 node.js https 服务器。我相信它们来自 godaddy,但不确定。我的雇主只向我提供了 key 和证书文件。

服务器:

var fs = require('fs')
  , server = require('https').createServer({
      key: fs.readFileSync( __dirname + "/key.pem" ),
      cert: fs.readFileSync(__dirname + "/cert.pem" )
    })
  , WebSocketServer = require('ws').Server
  , webSocketServer = new WebSocketServer({
      server: server,
    })
  , port = 8080;

server.listen(port, function(){ console.log('Listening on ' + server.address().port) });

客户:

var webSocket = new WebSocket('wss://my.website.com:8080');

此代码在桌面 chrome、safari 和 firefox 上按预期工作。客户端能够连接到安全的 websocket。但是,在 iOS 9.3.1 Safari 上尝试它会给我以下错误:

操作无法完成。(OSStatus 错误 -9807。)

OSStatus告诉我这是由无效的证书链引起的。不幸的是,这就是我对 SSL 的了解开始消退的地方。经过一些额外的谷歌搜索后,我尝试了 https.createServer() 接受的以下选项的多种组合:

secureProtocol: "SSLv3_method",
rejectUnauthorized: false,
ciphers: 'ECDHE-RSA-AES256-SHA:AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM',
honorCipherOrder: true,
requestCert: false

到目前为止,他们都没有工作。我还看到了 ca 选项(证书颁发机构),但我不仅不知道在哪里可以找到该文件,所有在线示例都表明这仅用于自签名证书?

非常感谢任何帮助,谢谢!

最佳答案

不知何故将 nginx 放在 Node 应用程序前面似乎解决了这个问题。我能够非常快速地完成以下配置(取自 this tutorial):

server {

    listen 443;
    server_name *.website.com;
    ssl    on;
    ssl_certificate    /etc/ssl/cert.pem;
    ssl_certificate_key    /etc/ssl/key.pem;

    location / {
        proxy_pass https://pr.iv.ate.ip:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

关于为什么它不能仅与 Node 一起工作仍然是一个很大的¯\_(ツ)_/¯,但话又说回来我对 ssl 的了解(有时通常是服务器配置)仍然有些有限。

关于iOS Safari 无法连接到安全的 websocket,但可以在桌面上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36726858/

相关文章:

ios - Realm 对象服务器未启动 - IOS

ios - animateWithDuration 在 vi​​ewWillAppear ios 9 objective-c 中不起作用

javascript - 无法连接到 Mongoose 实验室

ssl - Openvpn 配置未连接到服务器

java - Apache CXF 客户端在测试需要服务器名称指示 (SNI) 的服务器时出错

ios - 在没有 Storyboard的情况下以编程方式创建 segue

javascript - Node js。创建连接的正确/最佳实践

node.js - 将 n8n 部署到 Heroku

ruby-on-rails - Ruby 尝试从 https ://api. ruby​​gems.org 下载,即使使用源 key

ios - 使用可区分数据源时如何处理空状态 - UICollectionViewDiffableDataSource?