【问题标题】:WSS/TLS websocket connection with Swift iOS与 Swift iOS 的 WSS/TLS websocket 连接
【发布时间】:2015-02-14 14:57:58
【问题描述】:

已解决(以下答案)

我正在使用 Starscream 库在测试服务器中创建一个安全的 websocket wss,我们有一个自签名证书,但我发现无法建立连接。

var socket = WebSocket(url: NSURL(scheme: "wss", host: "selfsignedserver.com", path: "/")!)

日志

2014-12-16 10:38:10.260 pruebasignin[2135:363455] CFNetwork SSLHandshake failed (-9807)
websocket is disconnected: The operation couldn’t be completed. (OSStatus error -9807.)

当我尝试连接到服务器时,有效的证书也无法连接 已解决

var socket = WebSocket(url: NSURL(scheme: "wss", host: "production.com", path: "/")!)

日志

websocket is disconnected: Invalid HTTP upgrade

【问题讨论】:

  • 网站也必须使用 HTTPS 托管
  • @Rafa 是的,我的服务器正在使用 https 和 wss,我需要允许我的自签名证书
  • 而且 https 可以工作,但握手不行……这很奇怪,我从来没有遇到过,抱歉我帮不上忙。

标签: ios ssl swift websocket wss


【解决方案1】:

Starscream 现在支持一个标志,因此您可以使用自签名证书: https://github.com/daltoniam/Starscream/blob/bf0146db269249d200bb3bc4185cb5724cfa2ae8/README.md#self-signed-ssl-and-voip

(为后代编辑;自 2016 年 4 月发布的自述文件的链接)

【讨论】:

  • 它没有回答问题,因为您在此链接中找不到任何内容。
【解决方案2】:

我通过允许 Starscream 修改库的自签名证书解决了这个问题。 为此必须在 arcivo WebSocket.swift 中添加以下代码:

if url.scheme == "wss" || url.scheme == "https" {
        inputStream!.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL, forKey: NSStreamSocketSecurityLevelKey)
        outputStream!.setProperty(NSStreamSocketSecurityLevelNegotiatedSSL, forKey: NSStreamSocketSecurityLevelKey)

        /* My code */
        var settings = Dictionary<NSObject, NSObject>()
        settings[kCFStreamSSLValidatesCertificateChain] = NSNumber(bool:false)
        settings[kCFStreamSSLPeerName] = kCFNull

        CFReadStreamSetProperty(self.inputStream, kCFStreamPropertySSLSettings, settings)
        CFWriteStreamSetProperty(self.outputStream, kCFStreamPropertySSLSettings, settings)
        /* End my code*/

    }

【讨论】:

  • 这里的问题是:中间人攻击很容易执行,并且您没有获得此证书。这种“允许所有人,根本不证明”的心态似乎很正常……在生产力中使用它可能会给您带来一些麻烦。您应该寻找一种方法将您的证书添加到您的证书链中并针对它进行证明
  • @geo 是的,你是对的,但在我的情况下,它只适用于测试服务器,我们只有生产服务器上的证书。
  • 服务器端用什么?
  • 这已经在库中完成了,通过将标志 selfSignedSSL = true 设置为您的 WebSocket 对象。
猜你喜欢
  • 2014-07-06
  • 2021-09-28
  • 1970-01-01
  • 2015-12-18
  • 2016-07-09
  • 1970-01-01
  • 2021-06-19
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多