我正在尝试签署一个内核扩展文件"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).有人能帮我找出我做错了什么吗?
发布于 2015-03-10 21:47:00
您没有明确地这样说,但是从您正在获得的输出来看,您似乎是在尝试协同设计一个多体系结构的kext?如果是的话,就别这么做!
命令codesign --verify -vvvv abc.kext适用于我构建和签名的kexts,不需要显式的体系结构。kextutil -n是任何不兼容的很好的指示器,包括代码签名,但它只适用于运行中的OS版本,因此您需要检查它是否与您计划支持的所有版本一起使用。
如果出于某种原因,您需要创建一个基于现有通用二进制代码而非源代码的kext签名版本,则需要提取该二进制文件的64位部分,从中创建一个kext包并对其进行签名。然后,您的安装程序可以将此签名64位的kext放在/Library/Extensions中,如果安装程序检测到它正在包含OSX10.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是最初的通用文本,ABC-64是您将要签署的新文本。您应该给签名的kext提供相同的包标识符,但是绑定版本号要比通用的要高,尽管它们在功能上是相同的。如果操作系统可加载,则将选择较高版本的版本。
不同OS版本中的文本需求概述:
签名的kexts只会在OSX10.8和更新版本上加载,而这些版本都带有64位的内核。如果您想支持旧版本的OS,您将需要一个单独的kext为这些版本。OSX10.6和10.7内核可以是32位或64位,所以如果您想支持这些版本,请使用一个未签名的通用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,该版本支持该构建的OS版本。部署目标机制不适用于kexts。(大部分情况下)
https://stackoverflow.com/questions/28966381
复制相似问题