我想在本地环境中在我的RPI和iOS 11移动应用程序之间创建安全的通信通道.我的RPI正在运行python API代码,我的iOS移动应用程序会为RPI创建不同的API调用.对于安全连接,我使用的是由我的私有证书颁发机构签名的证书.所有证书和签名请求都是使用“OpenSSL”Linux命令行工具创建的.
正如我前面提到的,设备通过默认的.local域在本地网络中进行通信,该域由linux设备上的avahi服务和iOS设备上的bonjour(zeroconf)服务配置.一开始我在移动应用程序中加载证书时遇到了一些问题,在我做了一些研究之后,我发现我必须在xCode IDE中启用“NSAllowsLocalNetworking”标志.启用“NS”标志后,SSL证书固定成功并建立了安全通信.
我不知道的,我想知道的是两件事:
>当启用“NSAllowsLocalNetworking”标志时,Apple方面是否有限制将应用程序发布到应用程序商店?
>除了使用证书之外,iOS移动应用和RPI之间的安全通信还有哪些其他选择?
解决方法:
您正在使用正确的方法.使用带有证书固定的自签名证书是正确的方法,只要您保护用于生成证书的密钥,就可以信任该连接.
事实上,Apple建议:
Note: Although ATS is unenforced for connection to local hosts, Apple strongly recommends using Transport Layer Security (TLS) for any
local connection, along with the use of a self-signed certificate to
validate the local IP address.
Apple专门针对此类场景创建了NSAllowsLocalNetworking.截至目前的Apple文档,使用此标志不会触发向Apple提供禁用ATS的理由的必要性.另外需要注意的是,此标志仅在iOS10及更高版本上受支持.
如果您需要支持旧版本,Apple提供了一种方法来支持旧版本.基本上,您将NSAllowsArbitraryLoads标志设置为true,以及NSAllowsLocalNetworking标志.基本上,iOS9只能理解,因此iOS 9设备完全禁用ATS. iOS 10了解NSAllowsArbitraryLoads和NSAllowsLocalNetworking,因此它内置了逻辑,让NSAllowsLocalNetworking覆盖NSAllowsArbitraryLoads,并为应用程序的其余部分保留ATS保护,同时允许本地网络连接通过. Apple在documentation page的标题下“支持旧操作系统”中涵盖了这一点.