Как использовать самозаверяющий сертификат с GCDAsyncSocket? - PullRequest
0 голосов
/ 22 декабря 2018

Я впервые пытаюсь реализовать сокеты в iOS.Мне дали файл .cer, который нужно использовать для правильного подключения к серверу.Сначала произошел сбой SecCertificateCreateWithData, поэтому после исследования мне пришлось конвертировать файл .cer в формат der (openssl x509 -in cert.cer -outform der -out certder.der), а затем iOS, похоже, приняла его.

mSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
    do {
        print("Connecting...")
        try mSocket.connect(toHost: host, onPort: port)
    } catch let error {
        print(error)
    }

// ...

public func socket(_ socket: GCDAsyncSocket, didConnectToHost host: String, port p:UInt16){
    print("didConnectToHost!\n");

    let cerPath = Bundle.main.path(forResource: "certder", ofType: "der")

        let data: NSData = try! Data(contentsOf: URL(fileURLWithPath: cerPath!)) as! NSData
        let cert: SecCertificate = SecCertificateCreateWithData(nil, data)!
    var certs: CFArray = [cert] as CFArray
    mSocket.startTLS([
        kCFStreamSSLCertificates as String: certs,
        kCFStreamSSLValidatesCertificateChain as String: false as NSNumber,
        kCFStreamSSLLevel as String:kCFStreamSocketSecurityLevelNegotiatedSSL,
        //GCDAsyncSocketSSLCipherSuites: acceptableCipherSuites as NSObject,
        GCDAsyncSocketSSLProtocolVersionMin: NSNumber(value: SSLProtocol.tlsProtocol12.rawValue),
        GCDAsyncSocketManuallyEvaluateTrust: false as NSNumber,
        kCFStreamPropertySSLPeerTrust as String: "X509" as NSString])
}

Однако мой журнал: Connecting... didConnectToHost! didDisconnect! Optional(Error Domain=GCDAsyncSocketErrorDomain Code=8 "Error in SSLSetCertificate" UserInfo={NSLocalizedDescription=Error in SSLSetCertificate}) подразумевается, что что-то не так с приложением сертификата.Чего не хватает?

Глядя на документацию, я подозреваю, что элемент с индексом 0 в массиве сертификатов должен быть SecIdentity.Как мне получить SecIdentity?

...