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

时间:2016-04-19 18:42:29

标签: ios node.js ssl websocket safari

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

服务器

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上尝试它会给我以下错误:

The operation couldn't be completed.(OSStatus error -9807.)

OSStatus告诉我这是由无效的证书链引起的。不幸的是,这里我的SSL知识开始消失。在进行了一些额外的Google搜索后,我尝试了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选项(证书颁发机构),但不仅我不知道在哪里找到这个文件,所有在线示例都表明这只用于自签名证书?

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

2 个答案:

答案 0 :(得分:3)

以某种方式将nginx放在节点应用程序前面似乎解决了这个问题。我能够很快地完成以下配置(取自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;
    }
}

还是一个很大的¯\ _(ツ)_ /¯为什么它不能仅仅用于节点,但是我对ssl(有时候服务器配置)的了解仍然有些局限。

答案 1 :(得分:0)

我也有这个问题。节点https + express + socket.io,我的网页在桌面游戏中运行良好,但在移动游猎中却没有。

在停止抓取并尝试之后,我发现问题是"证书链"。 https://stackoverflow.com/a/20444809/6939828

在注入" ca:chain.cer"后,我使用了TWCA的ssl认证。进入https.createServer的选项,相同的页面相同的代码只适用于移动safari。乌拉!