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?
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