请注意,应用程序的主要可执行文件(由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文件的应用程序运行的(这可能是密封资源版本引用的规则和文件计数与文件内容匹配).
解决方法
我们发现,当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接受.
我们没有任何进一步的.