Установка свойства 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))