2017-10-19 21 views
4

Je travaille sur un projet qui nécessite un support de certificat client avec des websockets. J'utilise actuellement Starscream, mais malheureusement, à la lecture de la documentation, il ne semble pas y avoir d'informations concernant le support pour cela. J'ai regardé autour de quelques autres bibliothèques de socket Web rapide, mais aucun d'entre eux ne mentionne le support pour celaLes websockets rapides n'acceptent pas le certificat client

Quelqu'un connaît-il des bibliothèques qui prennent en charge une telle fonctionnalité?

Toute information serait très appréciée !!

Edit:

Je suis actuellement en utilisant Starscream pour essayer. J'ai l'installation du certificat. voici le code que je suis en train jusqu'à

public struct IdentityAndTrust { 
    public var identityRef:SecIdentity 
    public var trust:SecTrust 
    public var certData : Data 
} 




var socket = WebSocket(url: URL(string: "\(ConstantKeys.ipAddress)")!, protocols: []) 
    var identityTest : IdentityAndTrust? 

func createTrust() 
{ 
    do 
    { 
     let urlPath  = Bundle.main.path(forResource: "client", ofType: "p12") 
     let url   = NSURL.fileURL(withPath: urlPath!) 
     let certificateData = try Data(contentsOf: url) 

     identityTest = extractTrustAndIdentity(certData: certificateData, certPassword: ConstantKeys.password) 
    } 
    catch 
    { 
     print(error) 
    } 
} 

func extractTrustAndIdentity(certData:Data, certPassword:String) -> IdentityAndTrust 
{ 
    var identityAndTrust:IdentityAndTrust! 
    var securityError:OSStatus = errSecSuccess 

    var items: CFArray? 
    let certOptions: Dictionary = [ kSecImportExportPassphrase as String : certPassword ]; 
    // import certificate to read its entries 
    securityError = SecPKCS12Import(certData as CFData, certOptions as CFDictionary, &items); 
    if securityError == errSecSuccess { 

     let certItems:CFArray = items as CFArray!; 
     let certItemsArray:Array = certItems as Array 
     let dict:AnyObject? = certItemsArray.first; 

     if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { 

      // grab the identity 
      let identityPointer:AnyObject? = certEntry["identity"]; 
      let secIdentityRef:SecIdentity = identityPointer as! SecIdentity!; 

      // grab the trust 
      let trustPointer:AnyObject? = certEntry["trust"]; 
      let trustRef:SecTrust = trustPointer as! SecTrust; 

      // grab the certificate chain 
      var certRef: SecCertificate? 
      SecIdentityCopyCertificate(secIdentityRef, &certRef); 
      let certArray:NSMutableArray = NSMutableArray(); 
      certArray.add(certRef as SecCertificate!); 

      identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certData : certData); 
     } 
    } 
    return identityAndTrust 
} 

je puis connecter la prise comme si

let key = SecTrustCopyPublicKey(identityTest!.trust)!; 
    let ssl = SSLCert(key: key) 

    socket.security = SSLSecurity(certs: [ssl], usePublicKeys: false) 
    socket.enabledSSLCipherSuites = [TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384] 
    socket.delegate = self 
    socket.connect() 

Mais je reçu le message d'erreur suivant

CFNetwork établissement de liaison SSL a échoué (-9807)

TCP Conn 0x604000173980 SSLHandshake a échoué (-9807) websocket est déconnecté: L'opération co ne sera pas complété. (Erreur OSStatus -9807.)

Je sais que le certificat est valide que je l'utilise pour faire des demandes https et il fonctionne très bien. Alors, quelqu'un sait pourquoi cela ne fonctionne pas? Ou est-ce que quelqu'un sait d'une autre bibliothèque de socket qui pourrait aider à ce problème?

Répondre

0

Vous pouvez effectuer l'épinglage SSL en utilisant simplement NSURLSession (URLSession) sans utiliser de bibliothèque tierce, mais si vous voulez toujours en utiliser un, SocketRocket, AFNetworking en a le support.

Les liens ci-dessous devraient vous aider:

http://www.yeradis.com/swift-authentication-challenge

http://www.indelible.org/ink/trusted-ssl-certificates/

https://jetforme.org/2013/05/validating-a-self-signed-ssl-certificate-in-ios-and-os-x-against-a-changing-host-name/enter link description here

Toutes les méthodes que vous choisissez (tiers ou URLSession), je vous suggère de faire lire cette sécurité numéro:

https://github.com/facebook/SocketRocket/pull/534

https://www.synopsys.com/blogs/software-security/ineffective-certificate-pinning-implementations/enter link description here

+0

Mon problème est pas avec SSL et épingler les requêtes Web, j'utilise alamofire, et je peux gérer les problèmes SSL sans problème. Mon problème est purement avec les websockets. Les bibliothèques de socket que j'ai examinées n'offrent pas un moyen de gérer ces problèmes d'authentification. SocketRocket ressemble à une possibilité, mais c'est une ancienne bibliothèque et écrite en Objective-c. J'espérais une solution Swift – AdamM