macOS 系统扩展:权利和使用配置文件签名

GTA*_*E86 5 macos code-signing-entitlements macos-catalina macos-system-extension driverkit

我有一个用于 USB 设备驱动程序的 macOS 系统扩展。当我禁用 SIP 并使用我的 cosign 身份(使用终端的“安全查找身份”从我的 Apple ID 生成)手动签名时,它会起作用 - 如此处所述:https : //github.com/knightsc/USBApp/issues/1

我可以激活和停用 dext 并在激活时将其与设备一起使用 - 我所做的和最终的例子如下:

将无代码 KEXT 迁移到无代码 DEXT

和这里:

激活无代码 DEXT 后获取 OSSystemExtensionErrorCodeSignatureInvalid

我获得了 Apple 的授权,并按照他们概述的步骤创建了一个配置文件,然后下载并安装了它。然后我按照 Apple 的授权电子邮件中引用的步骤手动签署应用程序:https : //help.apple.com/xcode/mac/current/#/dev1bf96f17e

我重建了我的应用程序并停用了我的驱动程序的所有现有实例。当我尝试激活新驱动程序时,激活请求失败并显示权利错误:“Error Domain=OSSystemExtensionErrorDomain Code=8”,我知道这表明存在权利/签名问题。

  • 使用 Apple 的配置文件对我的应用程序和驱动程序进行签名的正确方法是什么?

  • 我需要更新我的权利文件吗?这是我现有的文件:

应用程序

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
    <key>com.apple.developer.system-extension.install</key>
    <true/>
    <key>com.apple.developer.system-extension.uninstall</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

右旋

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.driverkit</key>
    <true/>
    <key>com.apple.developer.driverkit.transport.usb</key>
    <array>
        <dict>
            <key>idVendor</key>
            <integer>LEGACY VID</integer>
            <key>idProductArray</key>
            <array>
                <integer>PID1</integer>
                <integer>PID2</integer>
                <integer>PID3</integer>
                <integer>PID4</integer>
                <integer>PID5</integer>
            </array>
        </dict>
        <dict>
            <key>idVendor</key>
            <integer>NEW VID</integer>
            <key>idProductArray</key>
            <array>
                <integer>PID6</integer>
            </array>
        </dict>
    </array>
    <key>com.apple.security.app-sandbox</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

更新:

应用程序的 App ID 具有系统扩展功能,但没有附加的 DriverKit 功能。

dext 的 App ID 具有额外的 DriverKit 功能。

应用程序的配置文件具有

- com.apple.developer.driverkit set true
- com.apple.application-identifier set to <Team ID>.<App Bundle Identifier>
- keychain-access-groups set to <Team ID>.*
- com.apple.developer.system-extension.install set to true
- com.apple.developer.team-identifier set to Team ID
Run Code Online (Sandbox Code Playgroud)

Dext 的配置文件具有

- com.apple.developer.driverkit set true
- com.apple.application-identifier set to <Team ID>.<Driver Bundle Identifier>
- keychain-access-groups set to <Team ID>.*
- com.apple.developer.team-identifier set to Team ID
Run Code Online (Sandbox Code Playgroud)

更新 2:

这是我生成配置文件的过程:

  1. 注册新的配置文件 - 我在最底部的“分发”下选择“开发人员 ID”。这也是我生成的证书的用途。

  2. 生成供应配置文件 - 配置文件类型“Mac”,我选择一个 App ID。

  3. 选择证书 - 选择与分发模式兼容的证书。

  4. 附加权利 - 选择权利“DriverKit and System Extension Template for Mac Dev ID profile/Mac Direct Dist Profile”这会导致“扩展权利”显示为“com.apple.developer.driverkit”设置为“true”

  5. 查看、命名和生成。- 配置文件名称 - 选择一个名称并生成,然后下载并安装。

更新 3:

我提交了支持请求,最后得到了回复“我们已联系 DriverKit 权利筛选器更新您的权利模板以包含 USB 传输权利”希望这是进展!

pmd*_*mdj 5

一般回答:

\n

配置文件

\n
    \n
  • 您需要在开发者帐户的“证书、标识符和配置文件”区域中为 dext 和包含它的应用程序创建一个“应用程序 ID 。是的,dext 不是应用程序,但它仍然需要应用程序 ID。\n
      \n
    • 对于 dext,请确保在“附加功能”下勾选“DriverKit\xe2\x80\xa6”项
    • \n
    • 对于应用程序,确保勾选“系统扩展”。
    • \n
    • 确保您获得正确的捆绑包 ID
    • \n
    \n
  • \n
  • 设置完应用 ID 后,您将需要为计划使用的每个签名机制(通过开发者 ID 进行开发、分发或用于应用商店)以及应用和 dext 生成配置配置文件。\n
      \n
    • 确保在每个配置文件的“权利”部分下选择正确的“模板”。这些“模板”似乎是由在 Apple 处理您的权利请求的人员手动生成的,因此它们似乎没有一致的命名,但它们通常包含“系统扩展”和“DriverKit”。如果您没有看到下拉菜单,则您可能没有被授予此类代码签名的权利。
    • \n
    \n
  • \n
\n

Xcode 可以自行下载配置文件,但我另外建议将它们下载到本地文件中。这是因为您可以在配置配置文件上使用“QuickLook”来检查它们是否包含您期望的权利!在 Finder 中选择文件并按空格键。我强烈建议您在进行任何其他故障排除之前检查所有配置配置文件是否与相关目标的权利相匹配。权利文件中列出的每项权利(以 开头的权利除外com.apple.security.)都必须存在于配置文件中,否则将不起作用。

\n

权利

\n

嵌入您的 dext 的应用程序需要包含以下权利:

\n
<key>com.apple.developer.system-extension.install</key>\n<true/>\n
Run Code Online (Sandbox Code Playgroud)\n

我被告知(在 WWDC 实验室预约中)\xc2\xa0您还应该包含com.apple.application-identifier权利并将其设置为您在上面生成的应用程序 ID,这是 10 个字符的前缀,后跟一个点,然后是捆绑包ID。(前缀通常是您的团队ID)

\n

dext 将需要基本 DriverKit 权利,以及您的驱动程序使用的任何其他 driverkit 子系统的权利等。dext 也是沙箱化的。例如

\n
<key>com.apple.developer.driverkit</key>\n<true/>\n<key>com.apple.developer.driverkit.transport.usb</key>\n<array>\n    <dict>\n        <key>idVendor</key>\n        <integer>1452</integer>\n    </dict>\n</array>\n<key>com.apple.security.app-sandbox</key>\n<true/>\n
Run Code Online (Sandbox Code Playgroud)\n

同样,您显然com.apple.application-identifier也应该包括在内。

\n

具体回答:

\n

由于问题现已更新为权利文件和配置文件的具体内容,我可以发现以下问题:

\n
    \n
  1. 配置配置文件不包含 DriverKit USB 权利。也许您只是为了开发而被授予它,而不是为了分发?无论哪种方式,你都需要要求苹果解决这个问题。USB dext 的配置配置文件在 QuickLook 中应如下所示:com.apple.developer.driverkit.transport.usb 权利出现在使用 Quicklook 打开的配置文件中。 请注意,供应商 ID 已明确列出。
  2. \n
  3. 请勿在您的 USB(或 PCI)权利中包含产品 ID,除非 Apple 明确向您颁发了包含产品 ID 的配置文件。不过,我不认为他们目前正在做这件事,所以把他们排除在外。
  4. \n
  5. 我不确定该com.apple.developer.system-extension.uninstall权利的原始来源是什么,但它似乎出现在网络上的很多地方。但这实际上似乎没有必要,而且苹果也不同意。我不确定为什么您的应用程序启动时包含它,您是否已amfi_get_out_of_my_way=1在您的应用程序中启用了它boot-args
  6. \n
  7. 未在权利文件中声明的配置配置文件中的剩余权利是可以的。Xcode 可能会对此发出警告,但实际上并没有问题。
  8. \n
\n

如果修复所有问题后仍然遇到问题,我建议尝试在错误发生时捕获一些更详细的日志记录。以下命令行可能会有所帮助:

\n
log stream --info --predicate=\'process=="taskgated-helper" || process=="kernel" || process=="trustd" || process=="syspolicyd" || process=="amfid" || process=="sysextd"\'\n
Run Code Online (Sandbox Code Playgroud)\n

请随意使用您获得的任何看起来有用的诊断信息来更新问题,我将尽力帮助找出问题所在。

\n

附加信息:

\n

以下内容也可能有帮助:

\n\n