CFStream TLS Разрешить самоподписанный сертификат (Swift)
Привет, я разрабатываю приложение, которое взаимодействует с сервером с помощью Google Protobuf. Мне удалось установить сокет-соединение с сервером в swift (iOS) и отправлять и получать данные. Но я хочу защитить соединение с TLS. Мне удалось сделать это также с сертификатом, подписанным CA. но для целей разработки мне нужно иметь возможность разрешить самоподписанный сертификат с CFStreams.
Ниже приведен тестовый код, который я написал, чтобы разрешить самоподписанный сертификат.
//TEsts
var inputDelegate: StreamDelegate?
var outputDelegate: StreamDelegate?
var output:OutputStream!
var input:InputStream!
public func testSSL(){
var write:Unmanaged<CFWriteStream>?
var read:Unmanaged<CFReadStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, serverAddress as CFString, serverPort, &read, &write)
output = write!.takeRetainedValue()
input = read!.takeRetainedValue()
inputDelegate = self
outputDelegate = self
// Now that we have a strong reference, assign the object to the stream delegates
input.delegate = inputDelegate
output.delegate = outputDelegate
input.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode)
output.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode)
input.setProperty(kCFStreamSocketSecurityLevelTLSv1, forKey: Stream.PropertyKey.socketSecurityLevelKey)
output.setProperty(kCFStreamSocketSecurityLevelTLSv1, forKey: Stream.PropertyKey.socketSecurityLevelKey)
input.setProperty(kCFBooleanFalse, forKey: kCFStreamSSLValidatesCertificateChain as Stream.PropertyKey)
output.setProperty(kCFBooleanFalse, forKey: kCFStreamSSLValidatesCertificateChain as Stream.PropertyKey)
input.setProperty(kCFBooleanFalse, forKey: kCFStreamSSLIsServer as Stream.PropertyKey)
output.setProperty(kCFBooleanFalse, forKey: kCFStreamSSLIsServer as Stream.PropertyKey)
DispatchQueue.global(qos: .background).async {
self.output.open()
self.input.open()
var myMessage = "Hello From iPhone\n"
let myMsgData: NSData = myMessage.data(using: String.Encoding.utf8)! as NSData
self.output.write(UnsafePointer<UInt8>(myMsgData.bytes.assumingMemoryBound(to: UInt8.self)), maxLength: myMsgData.length)
}
}
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case Stream.Event.endEncountered:
print("STREAM DELEGATE ------>> End Encountered")
break
case Stream.Event.openCompleted:
print("STREAM DELEGATE ------>> Open Completed")
break
case Stream.Event.hasSpaceAvailable:
print("STREAM DELEGATE ------>> Has Space available")
break
case Stream.Event.hasBytesAvailable:
print("STREAM DELEGATE ------>> Has Bytes Available")
if aStream === input {
var inputBuffer = Array<UInt8>(repeating: 0, count:100)
input.read(&inputBuffer, maxLength: 100)
let msg = String(bytes: inputBuffer, encoding: String.Encoding.utf8)
print(msg)
}
break
case Stream.Event.errorOccurred:
print("STREAM DELEGATE ------>> Error Occured \(aStream.streamError?.localizedDescription)")
break
default:
print("STREAM DELEGATE ------>> Default")
}
}
Но когда я запускаю этот код, я получаю код ошибки OSStatus error -9807. Я также установил свойство не проверять цепочку сертификатов. Может кто-нибудь указать мне, что я здесь делаю неправильно?
Я новичок в Swift и iOS-программировании. Сервер написан на Java с использованием Netty