此处保留仅供历史参考。
目前,没有与所有当前 Swift 平台(Apple 和 Linux)兼容的标准 Swift 安全库。这种缺乏标准化导致了多个项目,这些项目要么编写自己的 Swift 安全功能,要么使用他们选择的安全库(无论是 OpenSSL、LibreSSL 等)。这是不可取的,因为它可能导致
本提案概述了一组设计目标以及 Swift 服务器 API 项目的安全工作组为创建在 Apple 和 Linux (Ubuntu) 平台上交叉兼容的单一 Swift 安全组件而应采取的方法。安全 API 将包括较低级别的加密 API(包括哈希、对称和非对称加密)以及更高级别的 API(包括密钥/证书管理和安全通信,例如 TLS)。
在 Apple 和 Linux 上为 Swift 提供一致的开发体验有助于提高开发人员的生产力、更安全的代码以及跨这些平台更好地重用 Swift 资产/库。
同时,利用平台的原生库是有利的,因为它可以提高可维护性,并可能提高整体安全性。这是由于对非原生库的版本和构建/安装方法缺乏控制和一致性所驱动的。
我们为 Swift 安全组件提出以下一组设计目标
使用这些目标,我们将在每个平台上使用以下原生库
然后,建议的解决方案将包括一个薄薄的 Swift 层,该层定义了一个通用的 API 表面,这些 API 表面使用 Linux 上的 OpenSSL 和 Apple 上的 CommonCrypto 和 Secure Transport 实现。
两个现有项目已采用与本提案类似的方法
有关更多信息,我们请读者参考 [https://developer.ibm.com/swift/2016/12/13/securing-kitura-cross-platform-challenges/],作者在其中讨论了 BlueSSLService 的底层框架中的差异如何导致略有不同的跨平台行为。
提供统一的跨平台 API 的直接解决方案是使用相同的底层安全库。下面我们展示了为什么在我们的解决方案中使用用户安装的或非原生的库是不可取的。
考虑 OpenSSL,它是一个跨平台库,可在 macOS 和 Linux 上运行。由于跨版本缺乏 API 兼容性,Apple 从 OS X v10.7 开始弃用了 OpenSSL。自弃用以来,用户负责自行安装和升级 OpenSSL。用户可以获取 OpenSSL 源代码并自行编译(并使用他们自己的自定义标志),或使用第三方软件包管理工具(如 homebrew 或 macport)或自行下载二进制文件。OpenSSL 可以在 macOS 上安装的多种方式导致了更大范围的 OpenSSL 二进制文件,这可能会导致与调用 API 和应用程序不兼容。反过来,这使得 API 的可维护性和正确性更加困难。
当我们考虑到 OpenSSL 跨版本的 API 兼容性不足以及用户现在完全负责库的升级这一事实时,这个问题会进一步加剧。升级的及时性也可能影响库和任何链接应用程序的安全性。
相比之下,原生框架由操作系统交付和维护,并且通常将 API 更改与操作系统版本相关联,这大大提高了链接应用程序的可维护性。
使用原生库的最后一个动机是,供应商通常会对其自己的模块进行安全认证流程,因此用户可以免费获得此认证。特别是,许多涉及政府或企业数据或用户的用例,都需要 FIPS 140 合规性或验证。FIPS 是美国政府 (NIST) 的加密标准,并且是大多数政府机构和许多企业的强制性要求。获得认证的过程是困难、昂贵且耗时的,并且仅由供应商和大型组织完成。
在 Linux 上,OpenSSL 包含 OpenSSL FIPS 对象模块,该模块已通过 FIPS 140-2 合规性验证(不仅仅是合规)。然而,由于 OpenSSL 在 macOS 上被弃用,Apple 不再在 macOS 上提交 OpenSSL 进行 FIPS 140 验证,因此 macOS 上的 OpenSSL 不再符合 FIPS 标准。Apple 提交了自己的 CoreCrypto 和 CoreCrypto Kernel 进行验证。
虽然 Linux 上有许多替代的加密和安全库,包括 LibreSSL、BoringSSL 等,但它们的开源版本不符合 FIPS 标准。例如,LibreSSL 有意删除了 OpenSSL 的 FIPS 对象模块,以使库更精简,从而提高安全性和性能。