目标:签署我自己的包和我自己的内核扩展。 "我自己"在上下文中意味着我写的,或者我在其他地方选择的,从他们的来源重新编译自己,并希望在我的机器上安装。
问题:小牛队不接受Code Signing Failure: code signature is invalid
的签名(但加载了kext),Yosemite甚至不加载它。
我有自己的CA和代码签名证书。我已经能够成功签署代码并设置策略,允许安装和执行由给定证书签名的代码 - codesign和spctl都喜欢它,如您所见输出如下。但是,这似乎不适用于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).
On Mavericks这个kext加载了一条警告信息,在Yosemite上它不会。
我注意到here并且在Apple CA CPS Developer ID中,证书必须具有以下扩展名:( 1.2.840.113635.100.6.1.18 )
才能将其指定为kext签名证书。我的没有它。我怀疑这是我的问题的原因,但不知道如何解决它。 spctl 中似乎没有类型选项来创建将指定证书指定为kext签名证书的策略。
如何添加此扩展程序(最好是在Keychain Certificate Assist中,尽管基于OpenSSL的解决方案也可以),但不支付Apple年度使用费和#34; 100美元?
答案 0 :(得分:4)
要从Apple申请Kext签名证书,您需要使用this form。
答案 1 :(得分:2)
只有Apple可以使用此OID生成证书,并认为它对内核有效。
有关更详细的说明,请参阅tonymacx86.com上的What's New in Kext Development。以下是相关部分。
OID 1.2.840.113635是Apple的公司前缀,其余部分是 OID描述证书中必须存在哪些特定属性" leaf" (签名证书)允许加载内核扩展。这个 表示只能使用a创建有效的,已签名的内核扩展 Apple提供的证书,作为99美元/年开发人员的一部分 计划,此外,有关方面必须填写一个 特殊形式解释他们需要证书的原因; KEXT 证书仅在要求和批准时提供。
虽然可以生成具有特定OID的证书并使用您自己的CA进行签名,但OS X只能识别Apple的CA以获取内核扩展。 Gatebreak's documentation简要提到了这一点。
更改kextutil,kextd和中嵌入的代码要求 kextcache所以它们允许除Apple的
以外的根证书
答案 2 :(得分:1)
任何人都可以使用他们想要的任何OID生成证书。事实上,OID一直在增加。您可以转到IANA,请求OID并破解gnutls / openssl源代码,以便为新的fangled字段启动generating certificates。需要在证书中进行代码签名的相关OID是documented。这应该处理可以签署kexts的个人CA和中间证书的生成。查看针对OpenSSL的patches,使其能够生成RPKI certificaes
下一个任务是弄清楚Apple如何将您的CA识别为锚证书。我的猜测是,您需要使用KeyChain Access导入生成的CA证书。如果苹果以某种方式对CA进行硬编码(不太可能并且将是愚蠢的),我们将注定失败。否则,它们必须从某些文件系统资源加载证书锚点。使用dtruss找出答案。我的初步调查点在/ System / Library / Keychains /