создать iOS 12 NWConnection, который использует сертификат клиента

Я пытаюсь настроить NWConnection, который выполняет сертификаты на стороне клиента:

self.connection = NWConnection(
    host: NWEndpoint.Host("servername"),
    port: NWEndpoint.Port(integerLiteral: 8899),
    using: .tls)

Но я думаю, что простая переменная класса .tls должна быть гораздо более сложным объектом NWParameters, но я в полной растерянности (документация довольно скудна) относительно того, что я создаю там, чтобы прикрепить клиентские сертификаты к параметрам. Я также не знаю, как я могу даже перейти от файла .crt/.pem к чему-то, что приложение управляет программно.

Каков пример того, как можно настроить NWParameters для поддержки клиентских сертификатов?

Контекст

Я пытаюсь настроить клиентское соединение для связи с брокером MQTT с использованием сертификатов на стороне клиента. Я смог проверить все это на стороне Linux с помощью командной строки. Для брокера MQTT требуется сертификат клиента и такая команда, как:

mosquitto_pub -h servername -p 8899 -t 1234/2/Q/8 -m myMessage --cafile myChain.crt --cert client.crt --key client.pem

делает работу красиво. Но OpenSSL — это достаточно черный ящик (для меня) на iOS, и я не знаю, что делать дальше. Мне удалось заставить работать все другие коммуникации MQTT с моими NWConnection экземплярами, включая TLS на стороне сервера и даже если он самоподписанный.


person Travis Griggs    schedule 31.01.2019    source источник
comment
stackoverflow.com/questions/54452129/   -  person Sachin Vas    schedule 01.02.2019
comment
@SachinVas, вопрос, на который вы ссылаетесь, также опубликован мной. Хотя оба они связаны с вопросами NWConnection, это две разные вещи. ЭТО вопрос касается программной обработки самозаверяющих сертификатов server. ЭТОТ вопрос касается того, как настроить клиентские сертификаты для NWConnection, выступающего в качестве клиента.   -  person Travis Griggs    schedule 01.02.2019
comment
Добавлены ссылки для контекста. Хотя MQTT уже 20 лет, вполне вероятно, что многие читатели не знают, что это такое. И NWConnection — очень новое дополнение к iOS.   -  person Caleb    schedule 02.02.2019
comment
Спасибо @Калеб. Я рефакторил вопрос, чтобы, надеюсь, часть NWConnection была в центре внимания, а материал MQTT - в качестве фонового контекста.   -  person Travis Griggs    schedule 02.02.2019
comment
@TravisGriggs Я знаю, что вы ответили только на свой предыдущий вопрос. Я думаю, что developer.apple.com/documentation/network/security_symbols по этой ссылке есть ответы на ваш вопрос.   -  person Sachin Vas    schedule 09.02.2019


Ответы (1)


Добрые люди на форумах разработчиков Apple помогли решить эту проблему. В iOS вы должны использовать возможность импорта p12:

let importOptions = [ kSecImportExportPassphrase as String: "" ]  
var rawItems: CFArray?  
let status = SecPKCS12Import(P12Data as CFData, importOptions as CFDictionary, &rawItems)  
let items = rawItems! as! Array<Dictionary<String, Any>>  
let firstItem = items[0]  
let clientIdentity = firstItem[kSecImportItemIdentity as String]! as! SecIdentity  
print("clientIdentity \(clientIdentity)")

Теперь, когда у него есть идентификатор, вы можете использовать его для настройки securityProtocolOptions параметров TLS:

let options = NWProtocolTLS.Options()
sec_protocol_options_set_local_identity(options.securityProtocolOptions, sec_identity_create(clientIdentity)!)

sec_protocol_options_set_challenge_block(options.securityProtocolOptions, { (_, completionHandler) in
    completionHandler(sec_identity_create(clientIdentity)!)
}, .main)

let parameters = NWParameters(tls: options) // use this in the NWConnection creation

Для справки: тема форума разработчиков Apple, где это обсуждается.

person Travis Griggs    schedule 13.02.2019