2016-08-16 9 views
0

私はクラウドにソケット要求を受け入れるpythonサーバーを持っています。私はPythonサーバーアプリケーションと通信するためにNS(イン/アウト)putstreamsを使用するSwift(xCode)クライアントアプリケーションを持っています。SwiftでNSStream(s)を使用して自己生成のssl certを使用する方法

サーバーで自分のSSL証明書とキーファイルを生成しました。

私のサーバー側でSSLラッピングコードがコメントアウトされているので、私のクライアントとサーバーはちゃんと話すことができます。 SSLを使用すると、ハンドシェイクエラーが発生します。

サーバーとクライアントの両方がセキュリティレベルのプロトコルにTLSV1を使用しています。

Mac側では、自分のサーバー証明書ファイルをインストールしてユーザーのキーチェーンに入れることができますが、アプリケーションが信頼できる証明書を探していないと考えています。

NSStreamを実際にxCodeアプリケーションで直接使用するための証明書ファイルを指定する方法はありますか?または、アプリケーションに証明書をインストールする方法は?

あなたはそれがクライアントのそれを伝えることができ、パスから特定の証明書ファイルを使用するようにSSLでソケットを包むとき、私はPythonで知っています。 MacOS Swift相当品はありますか?

これはすべて間違っていますか?

以下は、私の「ライトソケット」スウィフトクラスです。シンプルなSupperですが、両端でSSLを使用しないときに機能します。

class SSLSocketLite { 

    // The input stream. 
    private var inStream: NSInputStream? 
    // The output stream. 
    private var outStream: NSOutputStream? 
    // The host to connect to. 
    private var host: String 
    // The port to connect on. 
    private var port: Int 

    init(inHost:String, inPort:Int) { 
     host = inHost 
     port = inPort 
     NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inStream, outputStream: &outStream) 
    } 

    func Open() { 
     inStream?.open() 
     outStream?.open() 

     inStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
     outStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
    } 

    func Read() -> String! { 
     var buffer = Array<UInt8>(count:1024, repeatedValue: 0) 
     if inStream!.hasBytesAvailable { 
      inStream!.read(&buffer, maxLength: 1024) 
      let responseString = NSString(bytes: buffer, length: buffer.count, encoding: NSUTF8StringEncoding) as! String 
      return responseString 
     } 
     return nil 
    } 

    func Write(msg:String) { 
     let data:NSData = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 
     outStream!.write(UnsafePointer(data.bytes), maxLength: data.length) 
    } 

    func Close() { 
     inStream?.close() 
     outStream?.close() 
    } 
} 

私は他の記事の束からこのすべてを集めますが、サーバーに出て通信するために呼び出す場所と証明書ファイルが実際スウィフトによって使用されている場合の一切の言及を見つけることができませんでした。

私に不足しているか誤解しているという重要な要素がある場合は、教えてください。そして、事前に感謝!

答えて

0

私の答えが見つかりました。私はオープンメソッドでこれらの行が欠けていた。

SSLのハンドシェイクを自動化する必要があります。

inStream?.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 
outStream?.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 

私の他の質問はまだ回答を使用することができます。

ありがとうございます!

関連する問題