【问题标题】:Can't sign kext in Mavericks/Yosemite?不能在小牛队/优胜美地签下kext?
【发布时间】:2014-11-09 17:08:52
【问题描述】:

目标:签署我自己的包和我自己的内核扩展。 “我自己的”在上下文中的意思是“我写的,或者我在别处选择的,从他们的源代码重新编译自己,并想安装在我的机器上。

问题:小牛队不接受我的 Code Signing Failure: code signature is invalid 签名(但会加载 kext),优胜美地甚至不会加载它。

我有自己的 CA 和代码签名证书。我已经能够成功地签署代码并设置允许安装和执行由给定证书签名的代码的策略 - codesignspctl 都喜欢它,正如您在下面的输出中看到的那样。但是,这似乎不适用于 kext(内核扩展)-kextutil 坚持认为签名无效。这是我得到的输出:

$ codesign --verify -vvvv /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: valid on disk
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: satisfies its Designated Requirement

$ spctl -a -vvv -t exec /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted
source=XXXXXCode
origin=XXXXXCoder
$ spctl -a -vvv -t install /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted
source=XXXXXInstall
origin=XXXXXCoder

$ kextutil -tn /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
Diagnostics for /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext:
Code Signing Failure: code signature is invalid
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext appears to be loadable (including linkage for on-disk libraries).

在 Mavericks 上,此 kext 加载时会显示警告消息,而在 Yosemite 上则不会。

我注意到hereApple CA CPS Developer ID 中的证书必须具有以下扩展名:( 1.2.840.113635.100.6.1.18 ) 以将其指定为 kext 签名证书。我的没有。我怀疑这是我的问题的原因,但不知道如何解决它。 spctl 中似乎没有类型选项来创建将给定证书指定为 kext 签名的策略。

如何添加此扩展程序(最好在 Keychain Certificate Assist 中,尽管基于 OpenSSL 的解决方案也可以),而无需支付 Apple 每年 100 美元的“使用费”?

【问题讨论】:

  • 没有编译你自己的内核来接受用你的证书签名的 kexts,你需要从 Apple 那里得到一个。从好的方面来说,如果您想要的只是用于签署应用程序、安装程序和 kexts 的证书,则不需要每年支付 100 美元 - 开发人员 ID 证书在 5 年后到期,而不是 1 年。
  • 谢谢,但我不确定我是否理解。 Developer Member Center 不允许一个人申请证书,直到/除非一个人注册特定的开发人员计划。 Mac Developer Program 的价格为每年 99 美元。我无法检查他们将颁发开发人员 ID 证书的时间。您是说一年后可以取消(或不续订)他的会员资格,但他的开发者 ID 证书不会再过期 4 年?
  • 是的,续订不是自动的。根据我的经验,开发者 ID 证书在颁发后 5 年到期。因此,我想如果您在到期前不久申请新证书,您总共将获得将近 6 年的时间。我怀疑一旦您的证书过期,任何如此签名的软件都将无法通过网守验证,因此在网守阻止它之前只有几个月的时间在网络上发布软件可能不是一个好主意。请注意,5 年在软件领域是一段很长的时间。到那时,Mac 可能会在 ARM CPU 上运行,并且根本不允许使用第三方 kext。 ;-)

标签: macos osx-mavericks code-signing kernel-extension


【解决方案1】:

要向 Apple 申请 Kext 签名证书,您需要使用 this form

【讨论】:

  • 这个答案唯一的问题是它需要一个Mac开发者支付99美元的年费。正如我最初的问题所述,这正是我想要避免的。
  • 当然,但是这个问题比那个表格更容易找到:我在表格之前很久就找到了这个。
【解决方案2】:

只有 Apple 可以生成具有此 OID 的证书并将其视为对内核有效。

请参阅 tonymacx86.com 上的 What's New in Kext Development 以获取更详细的说明。以下是相关部分。

OID 1.2.840.113635 是 Apple 的公司前缀,其余的 OID 描述了证书“叶子”中必须存在的特定属性 (签名证书)以允许加载内核扩展。这 意味着一个有效的、签名的内核扩展只能用 Apple 作为其 99 美元/年开发人员的一部分提供的证书 程序,此外,相关方必须填写一份 解释他们为什么需要证书的特殊表格; kext 证书仅在请求和批准时提供。

虽然可以生成具有特定 OID 的证书并使用您自己的 CA 对其进行签名,但 OS X 将仅识别 Apple 的 CA 用于内核扩展。 Gatebreak's documentation 简要提到了这一点。

更改嵌入在 kextutil、kextd 和 kextcache,因此它们允许 Apple 以外的根证书

【讨论】:

  • 这是否意味着我无法创建带有 OID 以 1.2.840.113635 开头的扩展名的证书,并使用我自己的在我的钥匙串中标记为受信任的 CA 签署该证书?它不会由 Apple CA 签名,但只要它们被标记为“受信任”,所有受信任的 CA 不都是平等的吗?我意识到这样的证书不允许我分发给定的 kext,但这不是必需的。
  • @Mouse 我相信 OSX 只会识别 Apple 的内核扩展 CA。 Gatebreak 简要讨论了这一点。不过,我很想被证明是错误的。
  • 我怀疑只有苹果才能生成具有特定 OID 的证书。我认为你需要做的就是破解 OpenSSL 来添加你想要的 OID,openssl 会很高兴地生成一个带有该 OID 的证书。我知道这一点是因为我从事 RPKI 工作,并且证书具有用于 BGP 和 IP 资源的新 OID...
  • @Lmwangi 不幸的是,根据 Gatebreak 的文档,OS X 只能识别 Apple 的内核扩展 CA。我已更新我的答案以包含此信息。
【解决方案3】:

任何人都可以使用他们想要的任何 OID 生成证书。事实上,OID 一直在被添加。您可以前往 IANA,请求 OID 并破解 gnutls/openssl 源代码以启动 generating certificates 为您的新奇特领域。需要在证书中的代码签名的相关 OID 是 documented。这应该处理可以签署 kexts 的个人 CA 和中间证书的生成。看看 patches 与 OpenSSL 的对比,它可以生成 RPKI certificaes

下一个任务是弄清楚 Apple 如何将您的 CA 识别为锚证书。我的猜测是,您需要使用 KeyChain Access 导入生成的 CA 证书。如果苹果以某种方式对 CA 进行硬编码(不太可能而且会很愚蠢),我们将注定失败。否则,他们必须从某些文件系统资源加载证书锚。使用 dtruss 找出答案。我最初的调查点在 /System/Library/Keychains/

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多