ios - Swift NSStream() SSL - 要求用户确认

标签 ios sockets ssl nsstream

我正在编写一个 TCPClient 类,用于在 Swift 中与 SSL/TLS TCP 套接字服务器进行通信,并且服务器在找不到或无法找到时自动生成自签名证书成功使用有效证书。这些自签名证书被用作套接字服务器

我正在尝试设置一个 iOS 应用程序,以在 TCP 客户端获得无效的 SSL 证书时通过类似的对话框提示用户浏览无效签名的网页。

这是我要向用户显示的对话框:

Verify Server Identity

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/

相关文章:

ios - 为什么我的 Print 语句没有被执行?

java - 发送多个非常小的数据包或更少的大数据包?

c - 使用c访问链接本地地址

linux - 套接字无法检测到断开连接

Wakanda 中的 SSL - 中间证书

python-3.x - 如何在python中验证签名文件

android - 是否可以更改 Unity 中内置的 iOS 和 Android 应用程序的图标

ios - 将数据备份到服务器时验证用户

ios - 在 ARKit 中获取一个点的绝对位置

ssl - Java8,JBoss AS5,SSLException : "Received fatal alert: handshake_failure"