2016-08-16 5 views
0

J'ai un serveur python dans le cloud qui accepte les demandes de socket. J'ai une application client Swift (xCode) qui utilise des puttreams NS (in/out) pour communiquer avec l'application serveur python. J'ai généré mes propres certificats SSL et fichiers de clés sur le serveur. Avec le code de retour à la ligne SSL commenté sur mon côté serveur, je peux obtenir mon client et mon serveur pour parler très bien. Avec SSL, je reçois des erreurs de poignée de main.Comment utiliser un certificat ssl auto-généré avec NSStream (s) dans Swift

Le serveur et le client utilisent TLSV1 pour le protocole de niveau de sécurité. Sur le côté mac, mon fichier de certificat serveur est installé et autorisé dans mon trousseau utilisateur, mais je pense que l'application ne recherche pas les certificats approuvés.

Existe-t-il un moyen de spécifier un fichier CERT, que NSStream (s) doit utiliser, directement dans l'application xCode de manière pragmatique. Ou un moyen d'installer le CERT sur l'application?

Je sais en python lorsque vous encapsulez un socket avec SSL, vous pouvez lui dire qu'il s'agit d'un client et d'utiliser un fichier cert spécifique à partir d'un chemin. Existe-t-il un équivalent MacOS Swift? Ou est-ce que je vais à peu près tout cela?

Ci-dessous est ma classe "Light Socket" Swift. Souper simple mais fonctionne quand on n'utilise pas le SSL aux deux extrémités.

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() 
    } 
} 

J'ai rassemblé tout cela d'un tas d'autres postes, mais n'a pu trouver aucune mention où et quand un fichier est cert effectivement utilisé par le Swift appelle à communiquer sur le serveur.

S'il y a un élément clé à cela que je suis soit manquant ou malentendu, s'il vous plaît faites le moi savoir! Et merci d'avance!

Répondre

0

J'ai trouvé ma réponse. Il me manquait ces lignes dans ma méthode ouverte.

Ils sont requis pour automatiser la prise de contact pour SSL.

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

Mes autres questions pourraient encore répondre.

Merci!