2017-10-17 19 views
0

CFStreamでTLS 1.2と通信することはできますか?はいの場合は、最善の方法は何ですか? SSLContextを設定するか、CFReadStreamSetPropertyを設定しますか?残念ながら、私はこれのための例を見つけることができません。誰かがこのために探している場合はここTLSを使用したCFStream

答えて

0

は、私のコードです:

var readStream: Unmanaged<CFReadStream>? 
var writeStream: Unmanaged<CFWriteStream>? 
var inputStream: InputStream! 
var outputStream: OutputStream! 

func connectToServer(host: String, port: Int, ssl: Bool=true) throws { 
    self.ssl = ssl 

    // Create StreamPair 
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host as CFString, UInt32(port), &readStream, &writeStream) 

    // CFStreamCreatePairWithSocketToHost creates unmanaged CFReadStreams. So let's take the retained value 
    // we have to release those values! 
    inputStream = readStream!.takeRetainedValue() 
    outputStream = writeStream!.takeRetainedValue() 

    if ssl == true { 
     let dict = [ 
      kCFStreamSSLValidatesCertificateChain: kCFBooleanFalse,  // allow self-signed certificate 
      kCFStreamSSLLevel: "kCFStreamSocketSecurityLevelTLSv1_2" // don't understand, why there isn't a constant for version 1.2 
      ] as CFDictionary 

     let sslSetRead = CFReadStreamSetProperty(inputStream, CFStreamPropertyKey(kCFStreamPropertySSLSettings), dict) 
     let sslSetWrite = CFWriteStreamSetProperty(outputStream, CFStreamPropertyKey(kCFStreamPropertySSLSettings), dict) 

     if sslSetRead == false || sslSetWrite == false { 
      throw ConnectionError.sslConfigurationFailed 
     } 
    } 

    // set the delegate of the streams 
    inputStream.delegate = self 
    outputStream.delegate = self 

    // schedule the streams for the runLoop 
    inputStream.schedule(in: .current, forMode: .commonModes) 
    outputStream.schedule(in: .current, forMode: .commonModes) 

    // open the streams 
    inputStream.open() 
    outputStream.open() 
} 
関連する問題