代码签名的内核扩展为什么不能在Yosemite(10.10)中加载?

9

我在Yosemite上有一个kext的代码签名。但是 kextload 加载失败。
它是版本2的 codesign。 codesign --verify 是正确的。
但kextload加载失败了。为什么不能在Yosemite中加载?

这是我的日志。

我已经使用codesign -dvvv ./myKext.kext进行了检查,一切正常。

codesign -dvvv ./myKext.kext 返回以下内容:

Executable=/Path/to/myKext
Identifier=com.myKext.kext.Firewall
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=317 flags=0x0(none) hashes=9+3 location=embedded
Hash type=sha1 size=20
CDHash=d0ff68bd8b49c650f45349c2d1570d45a8c1f148
Signature size=8544
Authority=Developer ID Application: My Kext Co., Ltd. (R2PBZJ465V)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=2014. 10. 31. 오전 11:09:35
Info.plist entries=18
TeamIdentifier=not set
Sealed Resources version=2 rules=12 files=1
Internal requirements count=1 size=188

这表明版本为2。
但是sudo kextload ./myKext.kext返回以下内容:

/Path/to/myKext.kext无法加载 - (libkern/kext) 不可加载 (未指定原因);检查系统/内核日志以获取错误信息, 或尝试使用kextutil(8)。

cat /var/log/system.log返回:

com.apple.kextd[19]: 错误:com.myKext.kext.Firewall的签名无效,无法加载

sudo kextutil -l ./myKext.kext返回:

Diagnostics for ./myKext.kext:
Code Signing Failure: code signature is invalid
ERROR: invalid signature for com.myKext.kext.Firewall, will not load

为什么会出现无效签名?!
我已经在Yosemite中使用版本2的codesign进行了签名。
我哪里签名错了吗?请有经验的人告诉我。


我只是猜测,但是苹果不需要参与代码签名才能使其有效吗? - trojanfoe
你向苹果请求过将kext codesign属性添加到你的DeveloperID中吗? - TheDarkKnight
这看起来像是与此问题相同:https://dev59.com/94Tba4cB1Zd3GeqP1iDu - pmdj
3个回答

8
我也遇到了同样的问题。现在,苹果更改了Mac开发者计划,并从中删除了kext的认证。因此,即使你是Mac开发者计划的成员,你也不会获得kext开发的认证,除非你在Developer ID and Gatekeeper上申请。
顺便说一下,苹果表示:
“KEXT签名旨在为大规模组织中广泛分发的商业出货kext或项目签名。”
所以我们可以通过添加“kext-dev-mode=1”引导参数来在KEXT开发模式下运行我们的Kext。就像这样:
sudo nvram boot-args="debug=0x146 kext-dev-mode=1"

然后重新启动。

希望这对您有所帮助。


此答案已过时,适用于El Capitan(10.11)。有关详细信息,请参阅其他答案。 - Ben Visness

0

我同意ParaDevil的回答。
对于OS X Yosemite,您可以执行以下操作:

  1. 下载“内核调试工具包”;
  2. 运行安装程序包;
  3. 继续进行“阅读说明”步骤;
  4. “阅读说明”中写道:

为了加载未签名的kexts,系统必须启用“KEXT开发者模式”,方法是添加“kext-dev-mode = 1”引导参数。以下命令(后跟重新启动)适合准备测试非生产kexts的系统:     

sudo nvram boot-args="debug=0x146 kext-dev-mode=1"

完成此操作后,机器将能够加载任何有效的kext;仍将检查签名,但验证失败将只导致日志消息。注意:这适用于包含二进制文件以及无代码(仅plist)的kext。系统将保持开发人员模式,直到您手动删除引导参数或清除nvram并重新启动。您可以通过重新定义引导参数为先前的设置或按以下方式清除引导参数来退出开发人员模式:

    

sudo nvram -d boot-args

苹果建议您在开发过程中使用KEXT开发者模式来签署驱动程序,而不是使用您的开发者ID证书。理想情况下,只有在驱动程序达到最终测试阶段并被评估是否发布给客户时,才应该使用开发者ID证书对其进行签名。

对于OS X El Captain 10.11,命令为:

sudo nvram boot-args="debug=0x146 kext-dev-mode=1"

没有影响。

阅读系统完整性保护指南/内核扩展以获取更多信息。


0

截至2016年12月:

这是由于在El Capitan(10.11)中引入的System Integrity Protection功能。从El Capitan开始,kext-dev-mode启动选项不起作用,因此ParaDevil的答案无效。相反,您必须按照this page上的说明禁用SIP。

  1. 通过重新启动计算机并在启动时按住Command和R键,进入恢复模式。

  2. 从实用工具菜单中启动终端。

  3. 运行以下命令:

    csrutil disable
    

当您重新启动时,系统完整性保护应该被禁用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接