我的内核扩展是否为Yosemite正确签名?

时间:2015-03-10 14:29:07

标签: ios code-signing sign kernel-extension osx-gatekeeper

我正在尝试签署内核扩展文件“abc.kext”。 我有一个启用了kext的证书,并试图使用以下方式签署我的“abc.kext”

codesign --sign "Developer ID Application: MyCompany (XXXXXXXX)" -a "x86_64" abc.kext

要验证签名是否成功,我运行:

codesign --verify -vvvv abc.kext 

,输出为:

abc.kext: code object is not signed at all

同时运行:

spct -a -v --type install abc.kext 

,输出为:

abc.kext:rejected
source: no usable signature

如果我跑:

kextutil -tn abc.kext

输出是:

abc.kext appears to be loadable (including linkage for on-disk libraries).

有人可以帮助我找到我做错的事吗?

1 个答案:

答案 0 :(得分:1)

您没有明确说出来,但是从您收到的输出中,您似乎正在尝试对多架构kext进行编码?如果是这样,请不要这样做!

命令codesign --verify -vvvv abc.kext适用于我已构建和签名的kexts,不需要显式架构。 kextutil -n是任何不兼容性(包括代码签名)的非常好的指标,但它仅适用于正在运行的OS X版本,因此您需要使用您计划支持的所有版本进行检查。

如果出于某种原因需要基于非源代码而不是现有的通用二进制文件创建kext的签名版本,则需要提取二进制文件的64位部分,从中创建一个kext包并签名那。然后,您的安装程序可以将此签名的64位kext放在/Library/Extensions中,如果安装程序检测到它正在包含OS X 10.8或更早版本的卷上安装,则另外将现有的通用kext放在/System/Library/Extensions中。 (此外,如果/当升级发生时,kext不会突然停止工作或生成签名警告。)

要提取64位二进制文​​件,请使用:

lipo -thin x86_64 abc.kext/Contents/MacOS/abc -output ./abc-64.kext/Contents/MacOS/abc

其中abc.kext是原始的通用kext,而abc-64.kext是您要签名的新kext。您应该为签名的kext提供相同的捆绑标识符,但捆绑的版本号比通用的更高,即使它们在功能上相同。如果可由操作系统加载,则会选择版本较高的版本。

不同OS X版本中kext要求的概述:

签名的kexts只会在OS X 10.8及更高版本上加载,而这些版本都只附带64位内核。如果您想支持旧版本的OS X,那么您需要为这些版本提供单独的kext。 OS X 10.6和10.7内核可以是32位或64位,因此如果要支持这些版本,请使用 unsigned 通用kext。 64位部分签名的kext可能加载到32位内核中,但在64位10.6 / 10.7内核上肯定不会加载。 10.5及更早版本只有32位内核,当然它们同时存在于PowerPC和i386变体中(后者仅来自10.4)。我不知道是否有可能创建一个3架构的kext,但我怀疑它是。只是不签名。

在10.9及更高版本上签名只是必需,因此您可以灵活选择每个kext所涵盖的版本。 (10.8也很乐意加载无符号通用kext的64位部分)

顺便说一下,在构建kexts时,请使用与该版本的最旧支持的OS X版本对应的OS X SDK。部署目标机制对于kexts不起作用。 (大部分)