如何在Linux中为Mac OS X应用程序签名?

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

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

显然,解决方法是对.app文件进行签名,因此我阅读了代码签名指南。除了重要问题如何将其集成到单击构建过程中之外,一切都很简单。
在我的Linux开发机器上构建所有平台的产品。 我运行一个Ant脚本,构建Windows安装程序、启动器EXE、Linux安装程序、OS X应用程序和DMG。所以我想将代码签名集成到这个过程中。
是否有适用于Linux的'codesign'等效物?
3个回答

8

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

到目前为止,我发现唯一的方法是通过SSH登录到Mac并使用它。

另一方面,根据@Steve McLeod (https://dev59.com/4Ggt5IYBdhLWcg3w5har#55906962) 的说法,安装程序包install4j提供了这个功能:

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

因此,在技术上是可能的。


到目前为止,这是我找到的最好的。如果有人知道如何在Linux中做到这一点,我会按照他们的方式授予答案... - Dan Gravell
问题在于,当通过SSH调用codesign工具时,我们收到了“不允许用户交互”的错误信息。:( - Mot
也许与您在OS X实例中安装的密钥有关?很抱歉,我不能提供更多帮助。 - Dan Gravell
1
可能需要先解锁钥匙串:security unlock-keychain - mstrap

2
您可以通过仅对您的应用程序的JavaApplicationStub和info.plist进行签名并排除“Resources”文件夹来解决此问题。然后,您需要更改构建过程以使用预签名容器。当然,这不是代码签名的意义所在,但它可以工作;-)
要实现这一点,请执行以下步骤:
  • 像往常一样创建您的.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" codesign -s "证书名称" --resource-rules ResourceRules.plist -fv MyApp.app

  • 然后删除Resource文件夹中的所有内容,并验证签名(codesign -v -v MyApp.app)。您将看到它仍然有效。

  • 在构建过程中使用完整的已签名存根。您可以更改Resources中的所有内容,但不能更改info.plist。


1
顺便问一下,在Linux上如何构建dmg文件? - Michael Wyraz
哈!好吧,那是另外一回事了。最初我使用了hfsutils(参见http://blog.serverhorror.com/2011/02/26/create-dmg-images-for-os-x-on-linux/)。然而,自那以后,我发现hfsutils将DMG不正确地写入以维护签名应用程序(通过与Apple支持的一张票证明了这一点)。因此,我不得不更改我的构建方式,通过ssh连接到Mac Mini并在那里创建DMG。 - Dan Gravell
1
这实际上有助于避免例如Gatekeeper警告吗? - Malcolm MacLeod

2
我使用一个名为 install4j的产品创建我的应用程序的DMG文件。它可以正确地在DMG文件中对应用程序进行代码签名,而且可以在macOS之外的操作系统上进行。但是请注意:install4j并不是免费软件,价格相当昂贵。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接