Установка свойства CFStream не удалась

Я пытаюсь настроить соединение TLS с SNI. Проблема в том, что первый вызов установки свойства возвращает 1, указывая, что он был принят. Следующие два возвращают 0, что означает, что они не прошли. В чем может быть причина?

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

Кроме того, делает kCFStreamSocketSecurityLevelNegotiatedSSL поддержка tls1.2, так как нет констант, чтобы выбрать это напрямую?

    var tempInputStream: Unmanaged<CFReadStream>?
    var tempOutputStream: Unmanaged<CFWriteStream>?

    CFStreamCreatePairWithSocketToHost(nil, address as CFStringRef, port, &tempInputStream, &tempOutputStream)

    let cfInputStream: CFReadStream = tempInputStream!.takeRetainedValue()
    let cfOutputStream: CFWriteStream = tempOutputStream!.takeRetainedValue()

//setting properties
    print(CFReadStreamSetProperty(cfInputStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL))
    print(CFReadStreamSetProperty(cfInputStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse))
    print(CFReadStreamSetProperty(cfInputStream, kCFStreamSSLPeerName, "peer.address"))


    let inputStream: NSInputStream = cfInputStream
    let outputStream: NSOutputStream = cfOutputStream

    inputStream.delegate = self
    inputStream.delegate = self

    inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

    inputStream.open()
    outputStream.open()

1 ответ

Решение

kCFStreamSSLValidatesCertificateChain а также kCFStreamSSLPeerName не являются свойствами потока. Это свойства настроек SSL. Вам нужно собрать их все вместе в словарь и назначить kCFStreamPropertySSLSettings:

let ssl = [
    String(kCFStreamSSLValidatesCertificateChain): kCFBooleanFalse, // You an probably use "false" here
    String(kCFStreamSSLPeerName): "peer.address"
]

print(CFReadStreamSetProperty(cfInputStream, kCFStreamPropertySSLSettings, ssl))
Другие вопросы по тегам