user1079052
user1079052

Reputation: 3843

Get GCDAsyncSocket to expect SSL in swift

I am using the following code when trying to connect a GCDAsyncSocket but I don't know how to get it to expect SSL. Right now my code is saying that it is connected but going to disconnected seconds later. The socket never shows me as connecting.

func connect(){
         bsocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
        bsocket.delegate = self
        do {
            try bsocket.connect(toHost: self.socketHost(), onPort: 443)
        } catch let e {
            NSLog("Error connecting socket: \(e)")
        }
    }

    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
        let response = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
        print("Received Response: \(response)")

        bsocket.readData(withTimeout: -1.0, tag: 0)
    }


    func disconnect(){
    }



    func socket(_ socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16)
    {
        var settings = [AnyHashable: Any](minimumCapacity: 3)
        settings[(kCFStreamSSLPeerName as String)] = self.socketHost()
        //  // Allow self-signed certificates
        settings[(kCFStreamSSLPeerName as String)] = Int(true)
        //  // In fact, don't even validate the certificate chain
        settings[(kCFStreamSSLValidatesCertificateChain as String)] = Int(false)


        print("Connected to \(host) on port \(p).")
        socket.readData(withTimeout: -1.0, tag: 0)
       // sendRequest()
    }

    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        NSLog("Socket Disconnected: \(err)")
    }


    func socket(_ sock:GCDAsyncSocket, didAcceptNewSocket newSocket:GCDAsyncSocket)
    {
        NSLog("New socket received: \(newSocket)")
    }

Upvotes: 0

Views: 1105

Answers (1)

Eden
Eden

Reputation: 1820

You seem to be setting the value for the kCFStreamSSLPeerName key twice:

settings[(kCFStreamSSLPeerName as String)] = self.socketHost()
//  // Allow self-signed certificates
settings[(kCFStreamSSLPeerName as String)] = Int(true)

Also, if you check out https://github.com/robbiehanson/CocoaAsyncSocket/blob/cae3732972501bbb39720be6213f30dc99d9f153/Source/GCD/GCDAsyncSocket.h you'll see that kCFStreamSSLValidatesCertificateChain is now an unavailable key and will throw an exception.

Upvotes: 0

Related Questions