问题描述
我有一个用于USB设备驱动程序的macOS系统扩展。当我禁用SIP并使用我的代码签名身份(由我的Apple ID使用终端的“安全性查找身份”从Apple ID生成)进行手动签名时,它可以工作-如此处所述:https://github.com/knightsc/USBApp/issues/1
我可以激活和停用dext,并在激活时将其与设备一起使用-我所做的并最终得到的示例如下:
Migrating a codeless KEXT to a codeless DEXT
在这里:
Getting OSSystemExtensionErrorCodeSignatureInvalid After Codeless DEXT is Activated
Apple授予我一项权利,并按照他们概述的步骤创建了配置文件,然后下载并安装了该文件。然后,我按照Apple授权电子邮件中提到的步骤进行了手动签名:https://help.apple.com/xcode/mac/current/#/dev1bf96f17e
我重建了我的应用程序,并停用了驱动程序的所有现有实例。当我尝试激活新驱动程序时,激活请求失败,出现授权错误:“ Error Domain = OSSystemExtensionErrorDomain Code = 8”,我知道这表明授权/签名问题。
应用
<?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>
Dext
<?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>
任何帮助将不胜感激。
更新:
应用程序的应用程序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:
-
选择证书-选择与分发模式兼容的证书。
-
其他权利-选择导致“扩展权利”显示为“ com.apple.developer.driverkit”的权利“ Mac Dev ID配置文件/ Mac Direct dist配置文件的DriverKit和系统扩展模板”是”
更新3:
我提交了支持请求,最后得到答复:“我们已联系DriverKit权利筛选器,以更新您的权利模板以包括USB传输权利”。希望这是进展!
解决方法
一般回答:
供应配置文件
- 您将需要在开发人员帐户“证书,标识符和配置文件”区域中为 dext 和包含它的应用创建一个“应用ID”。是的,dext不是应用程序,但仍需要一个应用程序ID。
- 对于dext,请确保在“其他功能”下勾选“ DriverKit…”项。
- 对于该应用,请确保已勾选“系统扩展”。
- 确保您正确输入了捆绑包ID
- 设置好应用ID后,您将需要为计划使用的每种签名机制(开发,通过开发人员ID分发或用于应用商店)生成provisioning profiles,并为应用和右旋
- 确保在每个配置文件的“权利”部分下选择正确的“模板”。这些“模板”似乎是由在Apple处理您的权利请求的人手动生成的,因此它们似乎没有统一的命名,但是它们通常包含“系统扩展名”和“ DriverKit”。 如果您没有下拉菜单,则可能没有获得这种代码签名的权利。
Xcode可以自己下载配置文件,但是我另外建议将它们下载到本地文件中。这是因为您可以在供应配置文件上使用“ QuickLook”来检查它们是否包含所需的权利!在Finder中选择文件,然后按空格键。 我强烈建议您在进行任何其他故障排除之前,检查所有配给配置文件是否与所讨论目标的权利相匹配。 您的权利文件中列出的所有权利(以com.apple.security.
开头的权利除外)都必须存在于供应配置文件中,否则它将不起作用。
权利
嵌入了dext的应用程序将需要具有以下权利:
<key>com.apple.developer.system-extension.install</key>
<true/>
有人告诉我(在WWDC实验室的约会中),您还应该包括com.apple.application-identifier
权利,并将其设置为上面生成的应用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
。
具体答案:
由于该问题现在已使用权利文件和供应配置文件的特定内容进行了更新,所以我发现以下问题:
- 供应配置文件不包含DriverKit USB授权。也许您只被授予开发的权利,而不是发行权?无论哪种方式,您都需要让Apple解决。 USB dext的供应配置文件在QuickLook中应如下所示:
- 除非Apple已明确向您发放包含ID的配置文件,否则请勿在您的USB(或PCI)权利中包含产品ID。我不认为这是他们目前正在做的事情,因此,请不要理会它们。
- 我不确定
com.apple.developer.system-extension.uninstall
权利的原始来源是什么,但似乎在网络上的很多地方都出现了。不过实际上似乎并没有必要,而且苹果公司也没有授予它。我不确定您的应用为何会随启动它一起运行,您可能在amfi_get_out_of_my_way=1
中启用了boot-args
吗?
您无需在权利文件中声明的预配配置文件中的 - 多余权利就可以了。 Xcode可能会对此发出警告,但实际上没有任何问题。
如果在解决所有问题后仍然遇到问题,我建议尝试在发生错误的那一刻捕获一些更详细的日志记录。以下命令行可能会有所帮助:
log stream --info --predicate='process=="taskgated-helper" || process=="kernel" || process=="trustd" || process=="syspolicyd" || process=="amfid" || process=="sysextd"'
随时使用您获得的任何有用的诊断信息来更新问题,我会尽力帮助您找出问题所在。
其他信息:
以下内容也可能会有所帮助:
- https://developer.apple.com/forums/thread/22943
- https://developer.apple.com/library/archive/technotes/tn2415/_index.html
我使用在Apple开发人员帐户的“证书,标识符和配置文件”页面中生成的供应配置文件中嵌入的权利。
对于应用程序和extext,我都创建了一个具有正确授权的“标识符”(针对应用程序的是“系统扩展名”,而对于extext,则是从附加功能中使用了DriverKit“ USB Transport-VendorID”。)
然后,生成两个配置文件,一个用于应用程序,一个用于dext。下载这些。
然后您可以使用此makefile规则为应用程序和dext生成一个plist:
%.plist: %.provisionprofile
security cms -D -i $< | plutil - extract Entitlements xml1 - -o $@
这保证您使用的权利与您的配置文件指定的权利相匹配。
如果您的配置文件中没有正确的权利,则您也没有选择正确的权利。否则,Apple未授予您正确的权利(因此在创建标识符时无法选择这些权利。)