我正在编写一个 TCPClient
类,用于在 Swift 中与 SSL/TLS TCP 套接字服务器进行通信,并且服务器在找不到或无法找到时自动生成自签名证书成功使用有效证书。这些自签名证书被用作套接字服务器
我正在尝试设置一个 iOS 应用程序,以在 TCP 客户端获得无效的 SSL 证书时通过类似的对话框提示用户浏览无效签名的网页。
这是我要向用户显示的对话框:
TCP 连接的建立方式如下:
public class TCPClient: NSObject, NSStreamDelegate {
let serverAddress = "127.0.0.1"
let serverPort = 7000
private var inputStream: NSInputStream?
private var outputStream: NSOutputStream?
public func connect() {
println("connecting...")
NSStream.getStreamsToHostWithName(self.serverAddress, port: self.serverPort, inputStream: &self.inputStream, outputStream: &self.outputStream)
self.inputStream!.delegate = self
self.outputStream!.delegate = self
self.inputStream!.open()
self.outputStream!.open()
self.inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
self.outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
var buffer: [UInt8] = [0]
// buffer is a UInt8 array containing bytes of a string.
self.outputStream!.write(&buffer, maxLength: buffer.count)
}
public func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
println("stream event.")
}
}
目前我只在尝试连接时看到这个:
connecting...
2015-09-13 19:48:25.562 AppName[] CFNetwork SSLHandshake failed (-9807)
最佳答案
首先,确保您熟悉新的 app transport security从 iOS 9 和 OS X 10.11 开始,并根据需要应用。如果可能,最好在您的服务器中支持适当的技术。
在连接你的流之前,使用 NSURLSession
为你的服务器创建一个模拟任务。实现 - URLSession:didReceiveChallenge:completionHandler:
委托(delegate)方法,并在那里验证服务器的证书。如果它不受信任,则向用户显示警报。我不熟悉系统提供的显示证书信息的方法,因此您可能需要实现它。用户批准后,将挑战中的证书添加到您应用的钥匙串(keychain)中。这将允许流连接到服务器。挑战结束后,像往常一样尝试流媒体连接并继续正常的应用程序工作流程。
关于ios - Swift NSStream() SSL - 要求用户确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32556113/