xcode - 在 Windows 上签署 OS X 应用程序(无需协同设计)

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

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

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

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

我已经发现签署应用程序会创建包含四个文件的 _CodeSignature 文件夹:

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

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

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

CodeRequirements 二进制文件的内容似乎是固定的。它似乎不会随着应用程序的内容而改变。感谢您的确认。这个文件有什么用?

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

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

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

native 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 版本 所指的 rulesfiles 计数与文件内容匹配)。

最佳答案

我们尝试使用libsecurity_codesigning的源代码对代码签名进行逆向工程。图书馆。虽然看起来可行,但是还是太费力了,所以我们考虑放弃。我们希望至少分享我们迄今为止所发现的内容,以便其他人可以在此基础上继续发展。

我们发现当 codesign没有找到 MachO 二进制文件,它会退回到 SecCodeSigner::Signer::signArchitectureAgnostic 中实现的“架构不可知”签名.

关键步骤:

  • CodeDirectory文件生成。除了文件头(包括目录版本)之外,该目录还包含 bundle 各个部分的少量 SHA-1 哈希
  • CodeSignature文件生成。签名标志CodeDirectory使用加密消息语法 (CMS) 格式的文件。可以使用 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 不接受这样的签名。

我们没有取得任何进展。

关于xcode - 在 Windows 上签署 OS X 应用程序(无需协同设计),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23381625/

相关文章:

ios - IBInspectable 和浮点值

macos - 无法在 Mac OS X 上运行 mongodb

mysql - 错误!服务器在 El capitan 上没有更新 PID 文件就退出了

air - Adobe AIR - 自签名应用程序可以吗?

clickonce - Authenticode 代码签名非常慢

xcode - 如何删除由 Xcode 8 自动管理签名创建的应用程序 ID?

ios - 无法检测到内存泄漏Xcode

iphone - 使单元格填充 UITableView 部分的宽度

ios - 模拟器在不同的 xcode 版本上产生不同的结果

linux - 使用节点脚本代替 bash