我想在本地环境中创建RPI和iOS 11移动应用程序之间的安全通信通道。我的RPI正在运行python API代码,我的iOS移动应用程序会为RPI创建不同的API调用。对于安全连接,我使用的是由我的私有证书颁发机构签名的证书。所有证书和签名请求都是使用“OpenSSL”Linux命令行工具创建的。
正如我前面提到的,设备通过默认的.local域在本地网络中进行通信,该域由linux设备上的avahi服务和iOS设备上的bonjour(zeroconf)服务配置。一开始我在移动应用程序中加载证书时出现了一些问题,在我完成一些研究之后,我发现我必须在xCode中启用“ NSAllowsLocalNetworking ”标记IDE。启用“NS”标志后,SSL证书固定成功并建立了安全通信。
我不知道的,我想知道两件事:
答案 0 :(得分:2)
您使用的是正确的方法。使用带有证书固定的自签名证书是正确的方法,只要您保护用于生成证书的密钥,就可以信任该连接。
事实上,它是由Apple推荐的:
注意:虽然ATS未连接到本地主机,但Apple强烈建议您使用传输层安全性(TLS) 本地连接,以及使用自签名证书 验证本地IP地址。
Apple专门为此类场景创建了NSAllowsLocalNetworking
。截至目前的Apple文档,使用此标志不会触发向Apple提供禁用ATS的理由的必要性。另外需要注意的是,此标志仅在 iOS10及更高版本上受支持。
如果您需要支持旧版本,Apple提供了一种方法来支持旧版本。基本上,您将NSAllowsArbitraryLoads
标志设置为true,以及NSAllowsLocalNetworking
标志。基本上,iOS9只能理解,因此iOS 9设备完全禁用ATS。 iOS 10+同时理解NSAllowsArbitraryLoads
和NSAllowsLocalNetworking
,因此内置逻辑以让NSAllowsLocalNetworking
覆盖NSAllowsArbitraryLoads
,并为应用的其余部分留下ATS保护,同时允许本地网络连接通过。 Apple在标题"支持较旧的操作系统"的documentation page上覆盖了它。