6

我有一个用于 USB 设备驱动程序的 macOS 系统扩展。当我禁用 SIP 并使用我的代码签名身份(使用终端的“安全查找身份”从我的 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>

右旋

<?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>

任何帮助,将不胜感激。

更新:

应用程序的 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

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

更新 2:

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

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

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

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

  4. 附加权利 - 选择权利“Mac Dev ID 配置文件/Mac Direct Dist 配置文件的 DriverKit 和系统扩展模板”,这会导致“扩展权利”显示为“com.apple.developer.driverkit”设置为“true”

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

更新 3:

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

4

2 回答 2

4

一般回答:

配置文件

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

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

权利

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

<key>com.apple.developer.system-extension.install</key>
<true/>

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

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

<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<array>
    <dict>
        <key>idVendor</key>
        <integer>1452</integer>
    </dict>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>

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

具体答案:

由于现在已使用权利文件和配置文件的具体内容更新了问题,因此我可以发现以下问题:

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

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

log stream --info --predicate='process=="taskgated-helper" || process=="kernel" || process=="trustd" || process=="syspolicyd" || process=="amfid" || process=="sysextd"'

随时使用您获得的任何有用的诊断信息更新问题,我将尽我所能帮助找出问题所在。

附加信息:

以下内容也可能会有所帮助:

于 2020-09-16T21:30:00.290 回答
1

我使用嵌入在苹果开发者帐户的证书、标识符和配置文件页面中生成的配置文件中的权利。

对于应用程序和 dext,我创建了一个“标识符”,具有正确的权利(应用程序的“系统扩展”和附加功能中的 DriverKit“USB 传输 - 供应商 ID”为 dext。)

然后,生成两个配置文件,一个用于应用程序,一个用于 dext。下载那些。

然后,您可以使用此 makefile 规则为应用程序和 dext 生成 plist:

%.plist: %.provisionprofile
        security cms -D -i $< | plutil - extract Entitlements xml1 - -o $@

这保证了您使用的权利将与您的配置文件指定的权利相匹配。

如果您的配置文件中没有正确的权利,您要么没有选择正确的权利。或者 Apple 未授予您正确的权利(因此在创建标识符时无法选择它们。)

于 2020-10-14T21:56:05.197 回答