使用Swift iOS建立WSS/TLS WebSocket连接

8

已解决(请看下面的答案)

我正在使用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
@Rafa 是的,我的服务器正在使用https和wss,我需要允许自签名证书。 - Ch4vi
HTTPS是可以工作的,但握手协议不行……这很奇怪,我从来没有遇到过这种情况,抱歉我无法提供帮助。 - Rafa
2个回答

3

它并没有回答这个问题,因为你在这个链接里找不到任何东西。 - JBarros35

2

我通过允许自签名证书来解决问题,修改了Starscream库。 此外,必须向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
@geo 是的,你说得对,但在我的情况下,这只是针对测试服务器,我们只在生产服务器上拥有证书。 - Ch4vi
你用什么作为服务器端? - uchuugaka
现在这已经在库中完成了,只需将标志selfSignedSSL = true设置到您的WebSocket对象即可。 - esh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接