создать iOS 12 NWConnection, который использует сертификат клиента - PullRequest
0 голосов
/ 31 января 2019

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

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

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

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

Context

Я пытаюсь настроить клиентское соединение для связи с брокером 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 на стороне сервера и даже если он самоподписан.

1 Ответ

0 голосов
/ 13 февраля 2019

Добрые люди на форумах разработчиков 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, где это обсуждается .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...