代码之家  ›  专栏  ›  技术社区  ›  Travis Griggs

创建使用客户端证书的iOS 12 NW连接

  •  1
  • Travis Griggs  · 技术社区  · 7 年前

    我正试图建立一个 NWConnection

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

    但我认为这很简单 .tls 类var需要更为复杂 NWParameters 对象,但我完全不知道(文档非常稀少)我在那里创建了什么来将客户端证书附加到参数。我也不知道我是如何从.crt/.pem文件移动到应用程序以编程方式管理的文件的。

    您将如何配置 NW参数

    上下文

    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 实例,包括服务器端TLS,即使它是自签名的。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Travis Griggs    7 年前

    苹果开发者论坛上善良的人们帮助解决了这个问题。在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 Developer Forum topic where this is discussed .