16

Wineの下でOS Xで実行できるWindowsアプリケーションがあります。便宜上、アプリケーションを OS X アプリ ( xxx.appWineBottler に基づくフォルダーの ZIP アーカイブ) としてパックします。

CFBundleExecutableアプリのメインの実行可能ファイル ( のタグで定義Info.plist) は、バイナリではなくシェル スクリプトであることに注意してください。

OS X Gatekeeper を通過するようにアプリケーションに署名したいと考えています。私の完全なビルド プロセスは Windows で実行されるため (実際には Mac をまったく持っていないため)、Windows で署名する必要があります。

_CodeSignatureアプリに署名すると、次の4 つのファイルを含むフォルダーが作成されることが既にわかりました。

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

これらのファイルの内容を説明する仕様は見つかりませんでした。

実験的に、これCodeResourcesはアプリ内のすべてのファイルの SHA-1 ハッシュを含む XML ファイルであることがわかりました。私はそれを生み出すことができます。

CodeRequirementsバイナリファイルの内容は固定のようです。アプリの内容と変わらないようです。ご確認いただければ幸いです。このファイルは何に適していますか?

バイナリファイルに関してはCodeDirectoryCodeSignature私には手がかりがありません。

どちらのファイルも、アプリのコンテンツによって変化します。アプリ ファイルの変更 (プレーン テキストのライセンス ファイルを含む) は、それらに影響を与えるようです。

CodeSignature明らかに署名が含まれています。ファイル内のコード署名証明書に関するプレーンテキスト情報を確認できます。ファイルを生成できるツールはありますか? 署名なので、かなり標準的なはずです。ただし、生成をより困難にする追加のバイナリ メタデータが存在する可能性があります。具体的に何に署名するか知っている人はいますか?CodeResourcesアプリ内の他のすべてのファイルを説明しているため、ファイルのみに署名していると想像できます。それとも、実際にアプリ内のすべてのファイルに再帰的に署名しますか?

ネイティブの OS X アプリCodeResourcesのみです。したがって、実際には署名はありません_CodeSignature。メインの実行可能バイナリに署名が埋め込まれているためだと思います。Info.plist私の [Windows] バイナリ (上記のように直接参照されていませんが) は、 Windows を使用してコード署名されていることに注意してくださいsigntool.execodesign -d -vvv xxx.app出力には証明書に関する情報が含まれているため、OS X は参照がなくても署名を認識しているようです。

Executable=/Applications/WinSCP.app/Contents/MacOS/startwine
Identifier=WinSCP
Format=bundle with generic
CodeDirectory v=20100 size=135 flags=0x0(none) hashes=1+3 location=embedded
Hash type=sha1 size=20
CDHash=a1ef4f04b2c1b4b793788ce3ab9d7881528f3d95
Signature size=4867
Authority=Martin Prikryl
Authority=VeriSign Class 3 Code Signing 2010 CA
Authority=VeriSign Class 3 Public Primary Certification Authority - G5
Signed Time=23.4.2014 23:51:18
Info.plist entries=14
Sealed Resources version=2 rules=12 files=846
Internal requirements count=2 size=136

紛らわしいのは、バイナリ名がまったく言及されていないことです。とにかく、それはゲートキーパーを喜ばせません。上記のテストは、既にCodeResourcesファイルが含まれているアプリに対して実行されることに注意してください (これはおそらく、ファイルの内容と一致するものとしてもSealed Resources version参照されます)。rulesfiles

4

2 に答える 2

9

libsecurity_codesigningライブラリのソース コードを使用して、コード署名のリバース エンジニアリングを試みました。実現可能に思えますが、それでも手間がかかりすぎるため、あきらめることを検討しています。少なくともこれまでに発見したことを共有したいと考えています。

で MachO バイナリが見つからない場合codesign、 で実装されている「アーキテクチャに依存しない」署名にフォールバックすることがわかりましたSecCodeSigner::Signer::signArchitectureAgnostic

そこでの主な手順:

  • CodeDirectoryファイル生成。ディレクトリには、ファイル ヘッダー (ディレクトリ バージョンを含む) に加えて、バンドルのさまざまな部分の SHA-1 ハッシュがいくつか含まれています。
  • CodeSignatureファイル生成。Cryptographic Message Syntax (CMS) 形式を使用した署名CodeDirectoryファイル。署名は、OpenSSL を使用して任意のプラットフォームで検証できます。

    openssl cms -verify -in CodeSignature -inform DER
        -content CodeDirectory -noverify -out CodeDirectory.verified
    

    -noverifyOpenSSL は証明書の「コード署名」の目的をサポートしていないように見えるため、証明書の検証をスキップする必要があることに注意してください。

    OpenSSL は、次のコマンドを使用して CMS 署名を作成できるはずです。

    openssl cms -sign -in CodeDirectory -out CodeSignature 
        -signer certificate.pem -outform DER
    

    しかし、そのような署名は OS X では受け入れられません。

それ以上は進みませんでした。

于 2014-05-15T04:44:10.927 に答える