Как использовать самогенерируемый сертификат ssl с NSStream(s) в Swift

У меня есть сервер Python в облаке, который принимает запросы сокетов. У меня есть клиентское приложение Swift (xCode), которое использует потоки ввода/вывода NS (вход/выход) для связи с приложением сервера python.

Я создал свой собственный сертификат SSL и файлы ключей на сервере.

С кодом оболочки SSL, закомментированным на стороне моего сервера, я могу заставить свой клиент и сервер нормально общаться. С SSL я получаю ошибки рукопожатия.

И сервер, и клиент используют TLSV1 для протокола уровня безопасности.

На стороне Mac у меня установлен файл сертификата сервера, и он разрешен в моей цепочке ключей пользователя, но я думаю, что приложение не ищет там доверенные сертификаты.

Есть ли способ прагматически указать файл сертификата для использования NSStream (ами) непосредственно в приложении xCode. Или способ установить сертификат в приложении?

Я знаю, что в python, когда вы обертываете сокет SSL, вы можете сказать, что это клиент, и использовать определенный файл сертификата из пути. Есть ли эквивалент MacOS Swift?

Или я все неправильно делаю?

Ниже мой класс Swift "Light Socket". Ужин простой, но работает, когда не используется SSL на обоих концах.

class SSLSocketLite {

    // The input stream.
    private var inStream: NSInputStream?
    // The output stream.
    private var outStream: NSOutputStream?
    // The host to connect to.
    private var host: String
    // The port to connect on.
    private var port: Int

    init(inHost:String, inPort:Int) {
        host = inHost
        port = inPort
        NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inStream, outputStream: &outStream)
    }

    func Open() {
        inStream?.open()
        outStream?.open()

        inStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
        outStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
    }

    func Read() -> String! {
        var buffer = Array<UInt8>(count:1024, repeatedValue: 0)
        if inStream!.hasBytesAvailable {
            inStream!.read(&buffer, maxLength: 1024)
            let responseString = NSString(bytes: buffer, length: buffer.count, encoding: NSUTF8StringEncoding) as! String
            return responseString
        }
        return nil
    }

    func Write(msg:String) {
        let data:NSData = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
        outStream!.write(UnsafePointer(data.bytes), maxLength: data.length)
    }

    func Close() {
        inStream?.close()
        outStream?.close()
    }
}

Я собрал все это из множества других сообщений, но не смог найти упоминания о том, где и когда файл сертификата фактически используется вызовами Swift для связи с сервером.

Если есть ключевой элемент, который я либо упустил, либо неправильно понял, пожалуйста, дайте мне знать! И заранее спасибо!


person Daniel Watson    schedule 16.08.2016    source источник


Ответы (1)


Я нашел свой ответ. Мне не хватало этих строк в моем открытом методе.

они необходимы для автоматизации рукопожатия для SSL.

inStream?.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
outStream?.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)

Однако на другие мои вопросы все еще можно было бы ответить.

Спасибо!

person Daniel Watson    schedule 16.08.2016