在Windows上签署OS X应用程序(无代码签名)

时间:2014-04-30 06:59:49

标签: xcode macos code-signing codesign code-signing-certificate

我有可以在Wine下的OS X上运行的Windows应用程序。为方便起见,我想将应用程序打包为OS X应用程序(基于WineBottler的xxx.app文件夹的ZIP存档)。

请注意,应用程序的主要可执行文件(由CFBundleExecutable的{​​{1}}标记定义)是一个shell脚本,而不是二进制文件。

我想签署应用程序以通过OS X Gatekeeper。由于我的完整构建过程在Windows上运行(因为我实际上根本没有Mac),我需要在Windows上签名。

我已经发现签署该应用会创建包含四个文件的Info.plist文件夹:

_CodeSignature

我没有找到任何描述这些文件内容的规范。

实验上,我发现CodeDirectory CodeRequirements CodeResources CodeSignature 是一个XML文件,其中包含应用程序中所有文件的SHA-1哈希值。我可以生成它。

CodeResources二进制文件的内容似乎是固定的。它似乎没有随应用程序的内容而改变。确认表示赞赏。这个文件有什么用?

至于二进制文件CodeRequirementsCodeDirectory我不知道。

两个文件都随应用内容而变化。似乎任何应用程序文件更改(包括纯文本许可证文件)都会影响它们。

CodeSignature显然包含签名。我可以在文件中看到有关代码签名证书的纯文本信息。有没有可以生成文件的工具?因为它是一个签名,它应该是非常标准的。虽然可能有一些额外的二进制元数据可以使生成更加困难。有谁知道它具体签署了什么?我可以想象它只标记CodeSignature文件,因为它描述了应用程序中的所有其他文件。或者它是否实际上递归地签署了应用程序中的所有文件?

原生OS X应用仅限CodeResources。所以CodeResources实际上没有签名。我想这是因为他们在主可执行二进制文件中嵌入了签名。请注意,我的[Windows]二进制文件(尽管上面提到的_CodeSignature没有直接引用它)是使用Windows Info.plist进行代码签名的。显然,即使没有引用,OS X也会识别签名,因为signtool.exe输出包含有关证书的信息:

codesign -d -vvv xxx.app

令人困惑的是,根本没有提到二进制名称。无论如何,它并没有让关守高兴。请注意,上述测试是针对已包含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 versionrules计数与文件内容匹配的内容)。

2 个答案:

答案 0 :(得分:8)

我们尝试使用libsecurity_codesigning库的源代码对代码签名进行反向工程。虽然看起来可行,但仍有太多的努力,所以我们考虑放弃。我们希望至少分享我们迄今为止所发现的内容,以便其他人可以继续发展。

我们发现当codesign找不到MachO二进制文件时,它会回到SecCodeSigner::Signer::signArchitectureAgnostic中实现的“架构无关”签名。

那里的关键步骤:

  • CodeDirectory文件生成。除了文件头(包括目录版本)
  • 之外,该目录还包含几个捆绑的各种SHA-1哈希值
  • CodeSignature文件生成。签名使用加密消息语法(CMS)格式签署CodeDirectory文件。可以使用OpenSSL在任何平台上验证签名:

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

    请注意,需要-noverify才能跳过证书验证,因为OpenSSL似乎不支持证书的“代码签名”目的。

    OpenSSL应该能够使用以下命令创建CMS签名:

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

    但OS X不接受此类签名。

我们没有再深入了解。

答案 1 :(得分:3)

不严格在Windows上签名,但您是否已将远程桌面视为朋友Mac或在云中租用Mac? http://www.macincloud.com似乎有相当合理的计划。

可以省去很多麻烦。您真正需要访问的是代码签名工具和终端。

编辑:您仍然需要一个Apple Developer帐户来签署该应用程序 - Gatekeeper仅允许来自Apple发布的开发者ID证书的签名。