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

0 ответов

Другие вопросы по тегам