में आईओएस एसएसएल कनेक्शन मैं अपने आईओएस ऐप से अपने बैकएंड सर्वर (नोड.जेएस) में एक साधारण सॉकेट कनेक्शन (कोई HTTP) स्थापित करने की कोशिश कर रहा हूं। सर्वर प्रमाणपत्र को एक कस्टम सीए का उपयोग करके बनाया और हस्ताक्षरित किया गया है जिसे मैंने स्वयं बनाया है। मेरा मानना है कि मेरे सर्वर पर भरोसा करने के लिए आईओएस प्राप्त करने के लिए मुझे किसी भी तरह से इस कस्टम सीए प्रमाणपत्र को भरोसेमंद प्रमाणपत्रों की सूची में जोड़ना होगा जो कि ट्रस्टस्टोर को जावा/एंड्रॉइड में कैसे काम करता है।स्विफ्ट
मैंने नीचे दिए गए कोड का उपयोग करके कनेक्ट करने का प्रयास किया है और कोई त्रुटि नहीं है हालांकि लिखने() फ़ंक्शन सफल नहीं लग रहा है।
मुख्य दृश्य नियंत्रक:
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 वर्ग
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()
}
}
मैं समझता हूँ कि कैसे SSL/TLS काम करता है और सभी के बाद से मैं यह सब के Android संस्करण में ठीक किया है यह वही ऐप मैं बस एसएसएल के आईओएस कार्यान्वयन के साथ उलझन में हूँ।
मैं जावा पृष्ठभूमि से हूं और इस समस्या के साथ 3 सप्ताह तक जा रहा हूं। किसी भी सहायता की सराहना की जाएगी।
स्विफ्ट कोड, नहीं उद्देश्य सी में जवाब पसंद करते हैं, लेकिन अगर आप केवल है Obj सी ठीक भी thats :)
धन्यवाद आदमी, यह अच्छी चीजें है! मैंने पहले ही सॉकेट की कार्यक्षमता का बड़ा हिस्सा निकाला था, लेकिन इससे मुझे एसएसएल काम करने में मदद मिली। – Sethmr
मेरी इच्छा है कि मैंने यह देखा था जब मैं शुरुआत में इस पूरी चीज की समस्या निवारण कर रहा था – Sethmr
खुशी हुई कि इससे आपकी मदद मिली। ईमानदारी से एसएसएल के लिए ऐप्पल बनाता है डिजाइन निर्णय भयानक हैं। आपको अपना खुद का भरोसेमंद रूट सीए "पहले" ट्रस्ट का मूल्यांकन करने में सक्षम होना चाहिए :( – Snapper26