Mar*_*ryl 14 macos xcode code-signing code-signing-certificate codesign
我有可以在Wine下的OS X上运行的Windows应用程序.为方便起见,我想将应用程序打包为OS X应用程序(xxx.app基于WineBottler 的文件夹的ZIP存档).
请注意,应用程序的主要可执行文件(由CFBundleExecutable标记定义Info.plist)是shell脚本,而不是二进制文件.
我想签署应用程序以通过OS X Gatekeeper.由于我的完整构建过程在Windows上运行(因为我实际上根本没有Mac),我需要在Windows上进行签名.
我已经发现签署应用程序会创建_CodeSignature包含四个文件的文件夹:
CodeDirectory
CodeRequirements
CodeResources
CodeSignature
Run Code Online (Sandbox Code Playgroud)
我没有找到任何描述这些文件内容的规范.
实验上,我发现这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
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,根本就没有提到二进制名称.无论如何,它并没有让关守高兴.请注意,上面的测试是针对已包含CodeResources文件的应用程序运行的(这可能与Sealed Resources version引用的内容相同,rules并且files计数与文件内容匹配).
我们尝试使用libsecurity_codesigning库的源代码对代码签名进行逆向工程.虽然看起来可行,但仍有太多的努力,所以我们考虑放弃.我们想至少分享我们迄今为止所发现的内容,以便其他人可以继续发展.
我们发现当codesign没有找到MachO二进制时,它又回到了"架构不可知"的签名中实现了SecCodeSigner::Signer::signArchitectureAgnostic.
关键步骤:
CodeDirectory文件生成.除了文件头(包括目录版本)之外,该目录还包含几个捆绑的各种SHA-1哈希值CodeSignature文件生成.签名签名CodeDirectory文件使用加密消息语法(CMS)格式.可以使用OpenSSL在任何平台上验证签名:
openssl cms -verify -in CodeSignature -inform DER
-content CodeDirectory -noverify -out CodeDirectory.verified
Run Code Online (Sandbox Code Playgroud)
请注意,-noverify需要跳过证书验证,因为OpenSSL似乎不支持证书的"代码签名"目的.
OpenSSL应该能够使用以下命令创建CMS签名:
openssl cms -sign -in CodeDirectory -out CodeSignature
-signer certificate.pem -outform DER
Run Code Online (Sandbox Code Playgroud)
但OS X不接受此类签名.
我们没有进一步.
| 归档时间: |
|
| 查看次数: |
4361 次 |
| 最近记录: |