大多数浏览器和
Developer App 均支持流媒体播放。
-
使用数字签名验证 App 的依赖项
了解如何保护 App的依赖项。我们将向你展示 Xcode 如何自动验证包含在项目中任意已签名的 XCFrameworks。了解代码签名的工作原理,其在帮助你保护软件供应链方面提供的优势,以及 SDK 开发者如何通过对其 XCFramework 进行签名来帮助你保证 App 的安全。
章节
- 2:18 - Dependency signatures
- 9:00 - App developers
- 12:11 - SDK authors
资源
相关视频
WWDC23
-
下载
♪ ♪
Kay:大家好 我是来自 Privacy Engineering 的 Kay 今天 我会向你介绍 Xcode 中一个 全新且令人兴奋的隐私和安全性功能 该功能可以帮助你 自动验证依赖项的完整性 在 Apple 我们坚信隐私 是每位开发者开发过程的核心 正如我们坚信 隐私也是我们的产品核心一样 Xcode 中的依赖项签名验证 可以帮助开发者保护其 App 同时也可以帮助 依赖项作者保护其分发的 SDK
各种 SDK 可用于 App 的开发 例如 iOS SDK 一些 SDK 由 Apple 创建 另一些由 App 开发者创建 以在其所有 App 中进行使用 还有一些是 App 开发者 从其他来源获取的 这些来源构成 App 的供应链 并包括框架、 Swift 源文件 和其他类型的依赖项 使用第三方 SDK 可以 极大程度地简化 App 的开发 并提供扩展功能 但是 这也引入了风险 保护供应链安全就是降低这些风险 你有责任选择你所包含的依赖项 来保护用户 同时确保不会意外使用 已被恶意修改的版本 SDK 作者也应该承担此责任 因为他们在开发过程中 也会包含其他的 SDK 手动执行降低这些风险的过程及工具 可能会很繁琐或复杂
依赖签名验证是 Xcode 的一个新功能 可以使这项任务变得轻松且自动化 鉴于你已经了解供应链安全的定义 接下来 我会谈谈 电子签名在保护开发者 以及减轻这一负担方面发挥的作用 首先 我会向你介绍 Apple 代码签名技术的工作原理 以及当前的 Xcode 如何 验证你的依赖项签名 接着 我会谈谈 App 开发者如何使用该功能 来确保其依赖项不会被篡改 最后 我将详述 SDK 作者 如何改进生态系统的安全性 我首先介绍 Apple 代码签名技术的工作原理
在你为 App 开发者 开发 SDK 时 你希望确保 SDK 在分发给客户时 无人能够对其进行修改或篡改 代码签名是一种机制 可用于将最终编译的二进制文件 以及相关元数据 例如 Info.plist 或框架的隐私清单 或对于特定类型的分发 例如源代码本身 与开发者身份进行加密链接
抽象一点说 代码签名的工作原理就是 首先生成编译二进制文件的 代码目录哈希 即 CDHash
接着 使用你的开发者身份 对该哈希进行签名 开发者身份由开发者证书表示 并由用于对代码进行签名的私钥 以及作为签名一部分 进行分发的公钥组成 并且 该签名可与 你的身份进行关联 然后 该身份 便会用于对哈希进行签名 并与安全时间戳进行结合 用于验证签名是否 是在特定时间点生成 从而 这就可以确保 如果有人篡改你的 SDK 签名将不再有效 同时 这还可以 让 App 开发者使用嵌入签名的证书 来验证是否是你本人进行的签名
xcframework 可能是你在 App 中使用的 常见依赖项 在 xcframework 中 签名位于 _CodeSignature 目录中 代码签名会保护 最终 xcframework 中 所有文件的完整性 其中包括 WWDC23 中的讲座 “隐私清单入门指南” 所提到的隐私清单文件
你可以手动验证包含在 App 中的 每个 xcframework 各个版本的代码签名 但这是一个极为费时的过程 并且会增加你从安全性获益的负担 签名验证是 Xcode 的一个新功能 可用于自动处理 App 中的 依赖性验证 并以检测到问题便发出警报的方式 来保护供应链的完整性 Xcode 15 推出的工具 可以帮助你自动跟踪用于 对项目中包含的 xcframework 进行签名的身份
现在 Xcode 还在 Inspector 中推出了一个新部分 用于显示 App 中包含的 xcframework 的签名状态 该部分会包含有关签名的信息 例如作者的身份 并且 其还会显示 xcframework 的签名 是由 Apple Developer Program 身份签发、由自签名证书签发 或是根本没有签名 此外 Xcode 还将记录 你首次使用 xcframework 时的身份 并会在后续编译过程中 验证该身份是否发生更改 针对不同的开发者身份 Xcode 会根据用于 特定 xcframework 的 身份所具有的信任程度 来提供不同等级的功能 对于 Apple Developer Program 身份 Apple 可以 对使用证书的有效性进行检查 例如证书是否已被吊销 并可以确保多个开发者 无法使用相同的名字进行注册 如果使用的证书是自签名的 App 开发者就应该 直接与依赖项作者 确认该证书的有效性和真实性
当 xcframework 作者的 签名证书过期时 Xcode 能够自动验证 新的 Apple Developer Program 身份证书 是否来自同一开发者 对于自签名证书 你需要手动验证 更改是否合法 因为没有 Apple 等受信任方 对证书进行验证 当依赖项是由 Apple Developer Program 身份签名时 Xcode 将会 在编译过程中对其进行验证 并会在签名无效、身份发生更改 或是 xcframework 在证书过期后签发的情况下 向你发出警报 同时 如果 Apple Developer Program 证书已被 Apple 吊销 Xcode 也会向你发出警报 如果 Apple 确定开发者帐户 是恶意的 那么便会发出这种警报 这些警报很少出现 并且会自动确保在问题得到解决之前 不会编译你的 App 但如果发生这种情况 Xcode 就会允许你删除 项目中的 xcframework 对于自签名身份 Xcode 仍会对 证书中的 SHA-256 指纹 和此前 添加到项目中的指纹进行比较 如果身份发生更改 或是依赖项的内容发生修改 其便会向你发出警报 你可能需要联系 xcframework 作者 以确保指纹与他们所使用的一致 或者 xcframework 作者 也可以发布该信息 以上就是数字签名在 xcframework 上的工作原理 接下来 我来向你演示一下 开发者如何在 Xcode 中 使用该功能 为了进行演示 接下来我会使用 Backyard Birds 示例 App 该 App 会为你提供数字观鸟体验 你可以拥有多个后院 可以放置鸟食和水 也可以查看观鸟访客何时出现 我计划使用一个 名为 BirdFeeder 的 xcframework 来自动化食物和水的补充过程 BirdFeeder xcframework 的作者已经对最新版本进行了签名 这里 我已经 将 BirdFeeder 添加到我的项目中 针对 xcframework Xcode 15 将在 Inspector 中推出“签名”视图 该视图会显示证书签名信息 并展示团队详细信息 并且 该视图会在第一次查看 xcframework 开发者身份时 就将其存储到项目中 在编译过程中 Xcode 会验证 用于对 BirdFeeder xcframework 签名的 身份是否与项目中的期待身份一致 这样就编译成功了 为了模拟供应链攻击 我会假装有人给我提供了 BirdFeeder xcframework 的更新版本 他们说新版本中添加了 许多令人兴奋的新功能 并会提供更好的性能 当你从一个不完全信任的网站上 下载 xcframework 时 就可能会发生这种情况 在这里 我使用更新版本 替换了之前的版本
在我编译 App 时 Xcode 就会验证 App 中 所有 xcframework 的签名 编译失败 Xcode 指出 BirdFeeder 开发者身份 与此前记录在项目中的身份不一致 选择“错误” 其便会发出警告 并向你解释开发者身份已被更改 同时还会展示预期身份 与新版本中身份的比较结果 在本例中 Xcode 显示的预期证书是 Apple Developer Program 证书 但项目中使用的是自签名证书 这可能意味着 xcframework 已被篡改 或发生了合法的更改 例如 他们可能将 xcframework 的所有权 转移给了另一个开发者 所以如果你不确定 选择取消总是安全的 这样你便有时间调查更改是否真实 Xcode 会在发生此类更改时 确保你自动收到通知 以保护你和你的 App
在本例中 由于更改不是预期的 所以我会在 Xcode 中 删除该新版本 但是 如果你知道更改是合法的 例如 开发者 通过经过验证的公共渠道 告知了你这一点 那么你便可以接受更改 最后 我会谈谈该功能 对 SDK 作者意味着什么 对 SDK 作者来说 对 SDK 进行加密签名十分重要 因为这样可以让 App 开发者 确认身份 并确保代码在签名后 没有被更改或篡改 这两点特性对于建立信任 以及安全分发 SDK 至关重要 正如我之前所介绍的 你可以使用两种类型的身份: Apple Developer Program 以及自签名
Apple Developer Program 的成员 应该使用该项目中包含的证书 来确保取得 SDK 客户的信任
如果你发布的是 SDK 那么你就应该使用 Apple 分发证书 如果你正在分发测试版本 则应该使用 Apple 开发证书 Enterprise Program 成员 应该使用其 iOS 分发 或 App 开发证书 在向你发放证书时 Apple 会证明 你是 Apple Developer Program 的 合法成员 并且已满足了获得证书所需的 所有必要条件 其中包括验证你的身份 以及遵守 Apple 的 隐私和安全性政策和指南 如果你手动撤销 用于对 SDK 签名的证书 那么你就需要发布一个 使用有效证书签名的更新版本 因为 Xcode 此后都无法验证 开发者尝试构建 App 时的签名 使用 Apple Developer Program 证书 签名的 SDK 具有最基本的信任级别 从而可以确保 SDK 未受到篡改 最重要的是 由于 Apple 是受信任的机构 证书验证会在生成新证书时 自动进行处理 在本视频的开头 我已经 详述了代码签名的工作原理 及其如何使用你的开发者身份 在 SDK 中包含签名 现在 我们再来看看如何使用 codesign 工具进行签名
你可以使用这里的命令 和你的 Apple Developer Program 身份 来对 xcframework 进行签名 并且 这里包含了时间戳标志 用于确保签名包含了 由 Apple 认证的安全时间戳 但是 如果你不是 Apple Developer Program 的成员 那么你就可以生成一个自签名证书 并将其 与 codesign 命令一起使用 并且 你需要与你的 SDK 客户 共享该证书的指纹 以便验证 xcframework 是否由你签名 开发者将你的 SDK 包含在其 App 中 便可以使用 Xcode 中的新功能 来确认 xcframework 是否由你签名 如果你总要对 分发的 SDK 进行签名 Xcode 中的新功能 也可以帮助你的 SDK 客户 在其供应链中获取更多信任 想要实现这一点非常简单 你可以直接使用此前发布的 框架版本 而无需编译任何内容 甚至 即便你当前不是 Apple Developer Program 的成员 你也可以使用自签名证书 接着 你就可以 将 codesign 命令包含在编译脚本中 并对所有新版本的 xcframework 执行此操作 这样你就不用再担心了 对于 App 开发者而言 Xcode 15 可以自动帮助你 确保 App 底层 SDK 的 完整性和安全性 你需要确保 所有得到验证的 SDK 签名 是可信任 App 开发 以及保护用户的重要方面 并且 你可以鼓励供应链中的开发者 对其发布的 SDK 进行签名 来提供帮助 SDK 作者需要 开始对 SDK 进行签名 来确保其安全性和真实性 通过对代码进行签名 你可以与 SDK 客户建立信任 并向他们展示 你对其安全性和隐私性的重视态度
祝你有愉快的 App 开发体验! 我是 Kay 本次讲座到此结束 ♪ ♪
-
-
14:37 - Signing an XCFramework
codesign --timestamp -v --sign "Apple Distribution: Truck to Table (UA527FUGW7)" BirdFeeder.xcframework
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。