Ich versuche eine einfache Socket Verbindung (KEIN HTTP) von meiner iOS App zu meinem Backend Server (Node.js) herzustellen. Das Serverzertifikat wurde mit einer benutzerdefinierten Zertifizierungsstelle erstellt und signiert, die ich selbst erstellt habe. Ich glaube, um das Vertrauen von iOS in meinen Server zu gewinnen, muss ich dieses benutzerdefinierte Zertifizierungsstellenzertifikat irgendwie zur Liste der vertrauenswürdigen Zertifikate hinzufügen, die verwendet werden, um das Vertrauen zu ermitteln, wie ein TrustStore in Java/Android funktioniert.iOS SSL Verbindung in Swift
Ich habe versucht, mit dem folgenden Code zu verbinden, und es gibt keine Fehler, aber die write() - Funktion scheint nicht erfolgreich zu sein.
Hauptansicht Controller:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let api: APIClient = APIClient()
api.initialiseSSL("10.13.37.200", port: 8080)
api.write("Hello")
api.deinitialise()
print("Done")
}
APIClient Klasse
class APIClient: NSObject, NSStreamDelegate {
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
func initialiseSSL(host: String, port: UInt32) {
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream)
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
inputStream?.delegate = self
outputStream?.delegate = self
inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
let cert: SecCertificateRef? = CreateCertificateFromFile("ca", ext: "der")
if cert != nil {
print("GOT CERTIFICATE")
}
let certs: NSArray = NSArray(objects: cert!)
let sslSettings = [
NSString(format: kCFStreamSSLLevel): kCFStreamSocketSecurityLevelNegotiatedSSL,
NSString(format: kCFStreamSSLValidatesCertificateChain): kCFBooleanFalse,
NSString(format: kCFStreamSSLPeerName): kCFNull,
NSString(format: kCFStreamSSLCertificates): certs,
NSString(format: kCFStreamSSLIsServer): kCFBooleanFalse
]
CFReadStreamSetProperty(inputStream, kCFStreamPropertySSLSettings, sslSettings)
CFWriteStreamSetProperty(outputStream, kCFStreamPropertySSLSettings, sslSettings)
inputStream!.open()
outputStream!.open()
}
func write(text: String) {
let data = [UInt8](text.utf8)
outputStream?.write(data, maxLength: data.count)
}
func CreateCertificateFromFile(filename: String, ext: String) -> SecCertificateRef? {
var cert: SecCertificateRef!
if let path = NSBundle.mainBundle().pathForResource(filename, ofType: ext) {
let data = NSData(contentsOfFile: path)!
cert = SecCertificateCreateWithData(kCFAllocatorDefault, data)!
}
else {
}
return cert
}
func deinitialise() {
inputStream?.close()
outputStream?.close()
}
}
Ich verstehe, wie SSL/TLS funktioniert und alle da ich dies alles in Ordnung in der Android-Version gemacht von die gleiche App. Ich bin nur verwirrt mit der iOS-Implementierung von SSL.
Ich bin von einem Java-Hintergrund und habe mit diesem Problem seit 3 Wochen gehen. Jede Hilfe wäre willkommen.
Bevorzugen Antworten in Swift Code, nicht Objective C, aber wenn Sie haben Obj C das ist auch ok :)
Danke Mann, das ist gute Sachen! Ich hatte bereits den Großteil der Sockets-Funktionalität herausgefunden, aber dies half mir, das SSL-Funktionieren zu erhalten. – Sethmr
Ich wünschte, ich hätte dies gesehen, als ich die ganze Sache am Anfang mit der Fehlersuche beging. – Sethmr
Ich bin froh, dass es dir geholfen hat. Ehrlich gesagt sind die Design-Entscheidungen, die Apple für SSL trifft, schrecklich. Sie sollten in der Lage sein, Ihre eigene vertrauenswürdige Stammzertifizierungsstelle hinzuzufügen, "bevor" die Vertrauensstellung ausgewertet wird :( – Snapper26