AFNetworking-Probleme mit der TLS-Überprüfung einer selbst signierten Server-Stammzertifizierungsstelle

Dies ist eine Frage, die versucht, Lösungen für meinen speziellen Anwendungsfall zu finden und zu dokumentieren, was ich für alle anderen versucht habe, die diesen Prozess verfolgen.

Wir haben einen RESTful-Server und eine iOS-App. Wir haben unsere eigene Zertifizierungsstelle und der Server verfügt über eine Stammzertifizierungsstelle und ein selbstsigniertes Zertifikat. Wir haben diesen Prozess befolgt, um die folgenden Dateien zu generieren:

http: //datacenteroverlords.com/2012/03/01/creating-your-own-ssl-certificate-authority

rootCA.pem rootCA.key server.crt server.key

Nur die Serverzertifikate werden auf unserem Server gespeichert, und im Rahmen des SSL-Prozesses werden die öffentlichen Schlüssel mit den API-Aufrufen zur Überprüfung gesendet.

Ich habe diesen Prozess befolgt, um mit AFNetworking sowohl das Pinning von Zertifikaten als auch das Pinning von öffentlichen Schlüsseln zur Überprüfung unserer selbstsignierten Zertifikate zu verwenden:

http: //initwithfunk.com/blog/2014/03/12/afnetworking-ssl-pinning-with-self-signed-certificates

Wir konvertieren die .crt-Datei gemäß dieser Anleitung in eine .cer-Datei (im DER-Format):

https: //support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-the

und nehmen Sie die CER-Datei (server.cer) in das iOS-App-Bundle auf. Dadurch kann unsere App erfolgreich GET / POST-Anforderungen an unseren Server senden. Da unser Serverzertifikat jedoch möglicherweise abläuft oder erneut ausgestellt wird, möchten wir stattdessen die Stammzertifizierungsstelle verwenden, wie dies von Personen in diesem Thread auf AFNetworking durchgeführt wird:

https: //github.com/AFNetworking/AFNetworking/issues/194

Zurzeit haben wir auf AFNetworking 2.6.0 aktualisiert, daher sollten unsere Netzwerkbibliotheken auf jeden Fall alle Aktualisierungen enthalten. Nehmen Sie diese in diese Diskussion auf:

https: //github.com/AFNetworking/AFNetworking/issues/274

Der Code, mit dem unsere Sicherheitsrichtlinie erstellt wurde:

    var manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
    manager.requestSerializer = AFJSONRequestSerializer() // force serializer to use JSON encoding

    let policy: AFSecurityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.PublicKey)
    var data: [NSData] = [NSData]()
    for name: String in ["rootCA", "server"] {
        let path: String? = NSBundle.mainBundle().pathForResource(name, ofType: "cer")
        let keyData: NSData = NSData(contentsOfFile: path!)!
        data.append(keyData)
    }
    policy.pinnedCertificates = data
    policy.allowInvalidCertificates = true 
    policy.validatesDomainName = false 
    manager.securityPolicy = policy

it server.cer können wir unserem Server vertrauen, indem wir den öffentlichen Schlüssel fixieren (auch AFSecurityPolicyPinningMode.Certificate). dies hat funktioniert, weil das genaue Zertifikat enthalten ist. Da wir jedoch möglicherweise die server.crt-Datei auf dem Server ändern, möchten wir dies nur mit rootCA.cer tun können.

Allerdings scheint dies nicht zu funktionieren, da nur die Root-CA im App-Bundle enthalten ist. Ist es so, dass die Root-Zertifizierungsstelle nicht über genügend Informationen zum öffentlichen Schlüssel verfügt, um das Serverzertifikat zu überprüfen, das mit der Root-Zertifizierungsstelle signiert wurde? Die Datei server.crt hat möglicherweise auch einen sich ändernden CommonName.

Auch, da ich die SSL-Terminologie ziemlich gut beherrsche, wäre es toll, wenn jemand klären könnte, ob ich die richtigen Fragen stelle. Die spezifischen Fragen sind:

Werde ich die Zertifikate korrekt generieren, damit der Server seine Identität anhand der selbstsignierten Datei server.crt nachweisen kann?Ist es möglich, nur die Datei rootCA.cer in das Bundle aufzunehmen und das Blattzertifikat server.crt zu überprüfen? Kann eine andere server2.crt-Datei überprüft werden, die von derselben Root-CA signiert wurde? Oder sollten wir ein Zwischenzertifikat zwischen rootCA und leaf einfügen?Ist Public Key Pinning oder Certificate Pinning die richtige Lösung dafür? Jedes Forum und jeder Blogbeitrag, den ich gelesen habe, sagt ja, aber selbst mit der aktuellsten AFNetworking-Bibliothek hatten wir kein Glück. Muss der Server irgendwie sowohl die server.crt- als auch die roomCA.pem-Signaturen senden?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage