【问题标题】:iOS Safari fails to connect to secure websocket, but works on desktopiOS Safari 无法连接到安全的 websocket,但可以在桌面上运行
【发布时间】:2016-08-12 03:09:44
【问题描述】:

我有一个使用 -自签名证书的 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 的了解开始消退的地方。在进行了一些额外的谷歌搜索后,我尝试了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 选项(证书颁发机构),但我不仅不知道在哪里可以找到这个文件,网上的所有示例都表明这仅用于自签名证书?

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

【问题讨论】:

  • iOS 9 仅接受使用 SHA-256 哈希签名的证书。因此,问题很可能出在您的雇主给您的证书文件上。要求他们使用 SHA-256 而不是 SHA-1 生成新证书并提供新证书。
  • 检查了 chrome 中的证书:*.website.comGo Daddy Secure Certificate Authority - G2 下,在 Go Daddy Root Certificate Authority - G2 下。所有这三个都列出了SHA-256 with RSA EncryptionIssuer Name > Signature Algorithm 下和RSA EncryptionPublic Key Info > Algorithm 下。我还应该提到,这个相同的证书用于一个完全独立的 rails 服务器,该服务器为客户端代码提供服务,然后尝试连接到 websocket。页面加载正常,但与 websocket 的连接失败。
  • 好的 - 除了查看这个类似的问题和答案之外,我没有任何其他建议,看看那里的建议是否有帮助:stackoverflow.com/questions/4014055/… 从另一个线程 - 确保你正在使用与证书签署的完全相同的主机和域进行连接(即确保证书是为 my.website.com 签署的,而不仅仅是 website.com)

标签: ios node.js ssl websocket safari


【解决方案1】:

不知何故将 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(有时是一般的服务器配置)的知识仍然有些有限。

【讨论】:

    【解决方案2】:

    我也有这个问题。 Node https + express + socket.io,我的网页在桌面 safari 上运行良好,但在移动 safari 上却不行。

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

    我正在使用 TWCA 的 ssl 认证,在将“ca:chain.cer”注入到 https.createServer 的选项中后,相同的页面相同的代码仅适用于移动 safari。万岁!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2014-07-09
      • 2023-01-05
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      相关资源
      最近更新 更多