iOS 应用程序与 Raspberry Pi 之间的安全通信

Secure communication between iOS app and Raspberry Pi

我想在我的 RPI 和本地环境中的 iOS 11 移动应用程序之间创建安全通信通道。我的 RPI 是 运行 python API 代码,我的 iOS 移动应用程序对 RPI 创建了不同的 API 调用。对于安全连接,我使用由我的私有证书颁发机构签名的证书。所有证书和签名请求都是使用“OpenSSL”Linux 命令行工具创建的。

正如我之前提到的,设备在本地网络中通过 linux 设备上的 avahi 服务和 iOS 设备上的 bonjour (zeroconf) 服务配置的默认 .local 域进行通信。一开始我在移动应用程序中加载证书时遇到了一些问题,在我做了一些研究之后我发现我必须有“NSAllowsLocalNetworking”标志在 xCode IDE 内启用。启用“NS”标志后,SSL 证书固定成功并建立了安全通信。

我不知道和想知道的是两件事:

  1. 启用“NSAllowsLocalNetworking”标志后,Apple 方面是否对将应用程序发布到应用程序商店有任何限制?
  2. 除了使用证书,在 iOS 移动应用程序和 RPI 之间的安全通信方面,我还有哪些其他选择?

您使用的方法正确。使用带有证书固定的自签名证书是正确的方法,只要您保护了用于生成证书的密钥,您就可以信任连接。

其实苹果推荐的是:

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 标志和 NSAllowsLocalNetworking 标志都设置为 true。基本上iOS9只懂,所以iOS9台设备一共禁用ATS。 iOS 10+ 理解 NSAllowsArbitraryLoadsNSAllowsLocalNetworking,因此它具有内置逻辑让 NSAllowsLocalNetworking 覆盖 NSAllowsArbitraryLoads,并为其余部分保留 ATS 保护应用程序,同时允许本地网络连接通过。 Apple 在 header "Supporting Older Operating Systems".

下的 documentation page 中涵盖了这一点