我正在尝试设置一个进行客户端证书的NWConnection:
self.connection = NWConnection(
host: NWEndpoint.Host("servername"),
port: NWEndpoint.Port(integerLiteral: 8899),
using: .tls)
但是我认为,简单的.tls
类var需要成为一个涉及更多的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上已经成为一个黑匣子(对我而言),我不知道从这里去哪里。我已经能够与我的NWConnection
实例一起使用所有其他MQTT通信,包括服务器端TLS甚至是自签名的。
答案 0 :(得分:0)
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)")
现在有了一个标识,您可以使用它来配置TLS选项的securityProtocolOptions
:
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