Ich versuche, eine sichere Verbindung zu einem Java-Server aufzubauen. SSLServerSocket.
Ich habe meine eigene Stammzertifizierungsstelle erstellt und das Zertifikat, dass der Java SSLServerSocket dieses Zertifikat verwendet, signiert.
Ich möchte dieses Stammzertifikat zu meiner App hinzufügen, damit jedes Zertifikat, das vom Stammzertifikat signiert wurde, funktioniert.
Bisher habe ich die sichere Verbindung in Ordnung, indem ich die Eigenschaften des Lese- und Schreib-Streams auf Folgendes setze:
%Vor%Ich füge das Zertifikat dem Schlüsselbund wie folgt hinzu:
%Vor%Das ist in Ordnung, aber ich möchte die Zertifikatskette validieren, so dass meine App nur Zertifikate annimmt, die von meiner CA (oder den standardmäßig vertrauenswürdigen) signiert wurden
Wie kann ich das tun?
Wenn ich kCFStreamSSLValidatesCertificateChain
auf yes setze, erhalte ich den Fehler: CFNetwork SSLHandshake failed (-9807)
, aber wenn es nein ist, ist es egal, wer das Serverzertifikat signiert hat, es wird trotzdem eine Verbindung herstellen (ich nehme an, das stimmt?)
Danke!
Technote 2232 , "HTTPS Server Trust Evaluation", sollte alle Antworten haben du brauchst. Es gibt Dokumentation und einige Beispiele, wie Serververtrauen ausgewertet werden kann.
Ich hatte das gleiche Problem, und während das Hinzufügen des Zertifikats das Problem behebt, bedeutet das auch, dass ich die App jedes Mal aktualisieren muss, wenn sich das Zertifikat auf dem Server ändert (z. was in meinem Fall in wenigen Tagen geschehen würde).
Wenn Sie eine IP-Adresse für die Verbindung mit dem Socket verwenden und das Zertifikat für den FQDN (vollqualifizierter Domänenname, dh subdomain.example.com) gilt, wird das Betriebssystem überprüft, wenn das Zertifikat überprüft wird Überprüfen Sie die IP-Adresse, mit der Sie eine Verbindung herstellen, vergleichen Sie sie mit dem Namen im Zertifikat und denken Sie, dass die beiden sich unterscheiden, wodurch die Validierung der Kette fehlschlägt.
Daher empfehle ich allen anderen, die auf dieses Problem stoßen, den FQDN im zweiten Parameter als CFStreamCreatePairWithSocketToHost
und nicht als IP-Adresse zu verwenden. Danach sollte es funktionieren, ohne dass das Zertifikat in das Paket aufnehmen und manuell validieren muss.
Tags und Links sockets ios ssl certificate-authority root-certificate