2016-07-14 22 views
1

Ich habe eine .pem-Datei, die über den Parameter --cert von curl erfolgreich eine Verbindung zu meiner Website herstellt. Ich dann umgewandelt, das zu einer der Datei:Alamofire und PEM-Zertifikat

openssl x509 -Informiere PEM -outform DER -in client.pem -out cert.der

Dann lud ich das cert.der in mein Projekt und ich versuche jetzt, mit Alamofire zu verwenden, nach dem Beispiel auf ihrer Homepage:

let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
     certificates: ServerTrustPolicy.certificatesInBundle(), 
     validateCertificateChain: true, 
     validateHost: true 
    ) 

    let policyManager = ServerTrustPolicyManager(policies: ["my.domain.com" : serverTrustPolicy]) 
    manager = Alamofire.Manager(configuration: configuration, serverTrustPolicyManager: policyManager) 
    manager.request(.GET, url, parameters: params, encoding: .URLEncodedInURL, headers: nil) 
     .authenticate(usingCredential: credential) 
     .validate() 
     .responseJSON { 

wenn das läuft, obwohl es nicht einfach, und ich bekomme ein als die localizedDescription des Fehlers ‚abgebrochen‘, das ist das, was Alamofire tut, wenn Authentifizierung schlägt fehl.

Was mache ich falsch?

+0

Hallo, ich versuche das gleiche zu tun, ich habe csr erstellt, schickte es an den Server und dann Client cert .... jetzt muss ich es kombinieren, wie hast du es programmgesteuert? Kannst du mir bitte Helfen? danke – beretis

Antwort

1

Die Fixierungslogik von Alamofire Cert unterstützt diesen Anwendungsfall derzeit nicht. Es ist nur für das Cert- und Public-Key-Pinning ausgelegt, nicht für Client-Zertifikate, die zur Authentifizierung mit dem Server verwendet werden. Dies können wir in Zukunft unterstützen, wenn dies ein häufiger Anwendungsfall ist.

Mit diesem gesagt, nehme ich an, in diesem Fall erhalten Sie eine NSURLAuthenticationChallenge mit einem Schutzbereich, der eine Authentifizierungsmethode des Typs .NSURLAuthenticationMethodClientCertificate hat. In diesen Fällen müssen Sie den Host der Challenge auswerten und dann unter Verwendung der API credentialWithIdentity:certificates:persistence: eine NSURLCredential erstellen. Wenn diese Anmeldeinformationen an den Beendigungshandler übergeben werden, sollte das Clientzertifikat an den Server gesendet werden, um die Verbindung zu authentifizieren. Weitere Informationen finden Sie unter here.

Die Clientzertifikatauthentifizierung (NSURLAuthenticationMethodClientCertificate) erfordert die Systemidentität und alle Zertifikate, die für die Authentifizierung beim Server erforderlich sind. Erstellen Sie ein NSURLCredential-Objekt mit credentialWithIdentity: certificates: persistence :.

Ich hatte noch nie eine Notwendigkeit, diese Art der Authentifizierung zuvor zu verwenden. Sie müssen die Auth-Challenge SessionDelegate Closure überschreiben, indem Sie den Task-Override-Abschluss verwenden, damit dies funktioniert.

+0

http://veewee.github.io/blog/authenticating-with-x509-client-certificates/ zeigt was ich mache. Dort kam ich auf die Idee, die Zertifikatsauthentifizierung durchzuführen. Grundsätzlich ist es schwierig, OAuth einzurichten und zu verwalten, und die Zertifikatsroute stellt sicher, dass Sie nicht kompromittiert werden, nur weil jemand ein Passwort für sein Passwort verwendet hat. – Gargoyle

+0

Nicht ganz sicher, wie Sie den Delegaten überschreiben. Kannst du ein kleines Beispiel geben? – Gargoyle

+0

Es macht nichts, ich habe herausgefunden, wie man es überschreibt. – Gargoyle