Tôi đang cố gắng thiết lập kết nối socket đơn giản (NO HTTP) từ ứng dụng iOS của tôi đến máy chủ phụ trợ của tôi (Node.js). Chứng chỉ máy chủ đã được tạo và ký bằng cách sử dụng CA tùy chỉnh mà tôi đã tự tạo. Tôi tin rằng để có được iOS tin tưởng máy chủ của tôi, tôi sẽ phải bằng cách nào đó thêm Chứng chỉ CA tùy chỉnh này vào danh sách các chứng chỉ đáng tin cậy được sử dụng để xác định loại tin cậy về cách TrustStore trong Java/Android hoạt động.Kết nối SSL SSL trong Swift
Tôi đã thử kết nối bằng mã bên dưới và không có lỗi tuy nhiên hàm write() dường như không thành công.
chính View 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")
}
lớp 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()
}
}
Tôi hiểu thế nào SSL/TLS hoạt động và tất cả vì tôi đã làm điều này tất cả tiền phạt trong phiên bản Android của cùng một ứng dụng này. Tôi chỉ nhầm lẫn với việc triển khai SSL của iOS.
Tôi đến từ nền Java và đã xảy ra sự cố này trong 3 tuần. Bất kỳ trợ giúp sẽ được đánh giá cao.
thích câu trả lời trong mã Swift, không Objective C nhưng nếu bạn chỉ có obj C thats ok quá :)
Cảm ơn người đàn ông, đây là công cụ tốt! Tôi đã tìm ra số lượng lớn các chức năng ổ cắm, nhưng điều này đã giúp tôi có được SSL làm việc. – Sethmr
Tôi ước gì tôi đã thấy điều này khi tôi khắc phục sự cố toàn bộ điều này trong đầu – Sethmr
Rất vui khi nó giúp bạn. Thành thật mà nói, quyết định thiết kế của Apple làm cho SSL là khủng khiếp. Bạn sẽ có thể thêm CA gốc tin cậy của riêng bạn "TRƯỚC" sự tin cậy được đánh giá: ( – Snapper26