1

カーネル拡張ファイル「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).

誰かが私が間違っていることを見つけるのを手伝ってくれますか?

4

1 に答える 1

1

明示的には言いませんが、取得している出力から、マルチアーキテクチャの kext をコード署名しようとしているように見えますか? もしそうなら、それをしないでください!

このコマンドcodesign --verify -vvvv abc.kextは、私が構築して署名した kext に対して機能し、明示的なアーキテクチャは必要ありません。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 には同じバンドル ID を指定する必要がありますが、機能的には同じであっても、ユニバーサル バージョンよりも高いバンドル バージョン番号を指定する必要があります。OS でロード可能な場合は、バージョンの高い方が選択されます。

さまざまな OS X バージョンでの kext 要件の概要:

署名付き kext は OS X 10.8 以降でのみロードされ、これらのバージョンはすべて 64 ビットのみのカーネルで出荷されます。古いバージョンの OS X をサポートしたい場合は、それらのバージョン用に別の kext が必要になります。OS X 10.6 および 10.7 カーネルは 32 ビットまたは 64 ビットのいずれかである可能性があるため、これらのバージョンをサポートする場合は、署名されていないユニバーサル kext を使用してください。64 ビット部分が署名されている kext は32 ビット カーネルでロードされる可能性がありますが、64 ビット 10.6/10.7 カーネルではロードされません。もちろん、PowerPC と i386 の両方のバリアント (後者は 10.4 以降のみ) として存在しますが、10.5 以前には 32 ビット カーネルしかありません。3 アーキテクチャの kext を作成できるかどうかはわかりませんが、可能だと思います。署名しないでください。

署名は 10.9 以降でのみ必要なため、各 kext がカバーするバージョンに多少の柔軟性があります。(10.8 では、署名なしのユニバーサル kext の 64 ビット部分も問題なくロードされます)

ちなみに、kexts をビルドするときは、そのビルドでサポートされている最も古いOS X バージョンに対応する OS X SDK を使用してください。デプロイ ターゲット メカニズムは、kexts では機能しません。(大部分)

于 2015-03-10T21:47:00.897 に答える