ios - 创建使用客户端证书的 iOS 12 NWConnection
问题描述
我正在尝试设置一个执行客户端证书的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 上的一个黑匣子(对我来说),我不知道从这里去哪里。我已经能够让所有其他 MQTT 通信与我的NWConnection
实例一起工作,包括服务器端 TLS,即使它是自签名的。
解决方案
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 开发者论坛主题。
推荐阅读
- mongodb - 在 $cond mongoDB 中使用表达式 $eq
- c# - 如何在 Windows 窗体上动态绘制图像?
- kubernetes - 如何将 GKE 的集群自动扩缩器日志导出到外部日志服务?
- javascript - 如何在Javascript中保持复选框的状态
- sql - SQL - 从连接两个表中获得结果的最快算法
- animation - FFmpeg:如何为每张视频幻灯片使用多个图像,并且动画/放大/缩小/淡化每个图像只有一个?
- ios - 如何执行 LinkingObject 的迁移?
- sublimetext3 - 如何在 Sublime Text 3d 中选择所选文本的上一个实例
- git - 如何从 Perforce 缓慢迁移到 Git
- php - 根据 Wordpress 用户对象中的数据创建带有指向页面的动态链接的按钮