Próbuję ustanowić proste połączenie z gniazdem (NIE HTTP) z mojej aplikacji na iOS do mojego serwera zaplecza (Node.js). Certyfikat serwera został utworzony i podpisany przy użyciu niestandardowego urzędu certyfikacji, który sam wykonałem. Uważam, że aby przekonać iOS do mojego serwera, będę musiał jakoś dodać ten niestandardowy certyfikat CA do listy zaufanych certyfikatów, które są używane do określenia zaufania, w jaki sposób działa TrustStore w Javie/Androidzie.Połączenie SSL iOS w Swift
Próbowałem połączyć za pomocą poniższego kodu i nie ma błędów, jednak funkcja write() wydaje się nie działać.
Widok główny Kontroler:
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")
}
klasa APIClient
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()
}
}
rozumiem jak SSL/TLS działa i wszystko od Zrobiłem to wszystko jest w porządku w Android wersji ta sama aplikacja. Jestem po prostu zdezorientowany z implementacją protokołu SSL na iOS.
Pochodzę z Java i pracuję z tym problemem przez 3 tygodnie. Każda pomoc będzie doceniona.
Wolisz odpowiedzi w kodzie SWIFT, nieobiektywne C, ale jeśli masz tylko Obj C to jest ok zbyt :)
Dzięki stary, to jest dobre! Zrozumiałem już większość funkcjonalności gniazd, ale pomogło mi to w działaniu SSL. – Sethmr
Szkoda, że nie widziałem tego, kiedy rozwiązywałem ten problem na początku. – Sethmr
Cieszę się, że ci pomogło. Szczerze mówiąc, decyzje projektowe, jakie Apple podejmuje dla SSL, są okropne. Powinieneś być w stanie dodać swój zaufany główny CA "PRZED" zaufanie jest oceniane :( – Snapper26