Я впервые пытаюсь реализовать сокеты в 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?