如何在 Linux 中对 Mac OS X 应用程序进行签名?

对于OS X,我在DMG中分发我的Java应用程序。自 Mountain Lion 发布以来,打开应用程序会显示以下错误消息:

[应用名称] 已损坏,无法打开。您应该弹出磁盘映像。

显然,修复方法是对.app文件进行签名,因此我阅读了代码签名指南。除了如何将其集成到我的一键式构建过程中的重要问题之外,一切似乎都很简单。

在所有平台上构建我的产品都发生在我的Linux开发机器上。我运行一个Ant脚本,Windows安装程序,入门EXE,Linux安装程序,OS X应用程序和DMG都已构建。因此,我想将代码签名集成到此过程中。

对于Linux来说,有没有等同于“codeign”的等价物?


答案 1

在 Linux 中没有记录的对 Mac OS X 应用程序进行代码签名的方法。

到目前为止,我发现这样做的唯一方法是将SSH到Mac中并使用它。

另一方面,根据@Steve McLeod(https://stackoverflow.com/a/55906962/28190)的说法,安装程序包install4j确实提供了以下功能:

Windows 和 Mac OS X 上的集成代码签名。在“常规设置”部分中,install4j 现在有一个“代码签名”选项卡,您可以在其中为 Windows 和 Mac OS X 配置代码签名证书。代码签名将应用于相应媒体文件中的所有启动器和安装程序应用程序。例如,代码签名的实现是跨平台的,因此您可以从 Linux 构建服务器对 Windows 和 Mac OS X 媒体文件进行签名。

因此,这在技术上必须是可行的。


答案 2

您可以通过仅对应用程序的 JavaApplicationStub 和 info.plist 进行签名,并从签名中排除“资源”文件夹来解决此问题。然后,必须更改生成过程以使用预签名容器。当然,这不是共同签名的感觉,但它会起作用;-)

为此,请执行以下步骤:

  • 像往常一样创建您的.app
  • 将其移至 Mac
  • 创建一个包含以下内容的文件“ResourceRules.plist”:

ResourceRules.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>rules</key>
        <dict>
                <key>^Resources/</key>
                <false/>
                <key>^version.plist$</key>
                <true/>
        </dict>
</dict>
</plist>
  • 现在使用以下命令签名: CODESIGN_ALLOCATE=“/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate” codeign -s “Certificate Name” --resource-rules ResourceRules.plist -fv MyApp.app

  • 然后删除资源中的所有内容并验证签名(codeign -v -v MyApp.app)。您将看到它仍然有效

  • 在生成过程中使用完整的已签名存根。您可以更改 参考资料 中的所有内容,但不能更改 info.plist。


推荐