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

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

请注意,应用程序的主要可执行文件(由Info.plist的CFBundleExecutable标签定义)是一个shell脚本,而不是一个二进制文件.

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

我已经发现,签名应用程序创建_CodeSignature文件夹与四个文件:

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

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

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

CodeRequirements二进制文件的内容似乎是固定的.它似乎不会随着应用程序的内容而改变.确认是赞赏.这个文件是什么好的?

对于二进制文件CodeDirectory和CodeSignature我没有任何线索.

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

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

本地OS X应用程序仅具有CodeResources.所以在_CodeSignature中实际上没有签名.我想这是因为它们在主可执行二进制文件中嵌入了签名.请注意,我的[Windows]二进制码(尽管如上所述不是Info.plist直接引用)使用Windows signtool.exe进行代码签名.显然,OS X识别签名,即使没有引用作为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文件的应用程序运行的(这可能是密封资源版本引用的规则和文件计数与文件内容匹配).

解决方法

我们已经尝试使用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

请注意,由于OpenSSL似乎不支持证书的“代码签名”目的,所以需要跳过证书验证.

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

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

但这种签名不被OS X接受.

我们没有任何进一步的.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...