我有可以在 Wine 下的 OS X 上运行的 Windows 应用程序。为方便起见,我想将应用程序打包为 OS X 应用程序(xxx.app基于 WineBottler 的文件夹的 ZIP 存档)。
请注意,应用程序的主要可执行文件(由CFBundleExecutable标记 of定义Info.plist)是一个 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
令人困惑的是根本没有提到二进制名称。无论如何,它不会让 Gatekeeper 高兴。请注意,上面的测试是针对已经包含CodeResources文件的应用程序运行的(这可能也是Sealed Resources version引用的内容,rules并且files计数与文件内容匹配)。