为 OS X Gatekeeper 对 Java 应用进行代码签名

7
我正在尝试将一个Java应用程序分发给OS X用户。我没有使用Mac商店,而是通过自己的网站进行分发。无论我尝试什么方法,OS X的Gatekeeper都会拒绝该应用程序。
我的方法如下:
(1) 像往常一样构建应用程序,获得JAR文件
(2) 使用appbundler,如此处所述:https://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html。这将创建一个.app文件,其中包含位于MyApp.app/Contents/PlugIns目录中的JVM,可以很好地运行。
(3) 用我的开发者证书签署应用程序: codesign -s 'Developer ID Application: MyCompany Ltd' --deep MyApp.app ...过程成功完成
(4) 验证.app是否符合Gatekeeper的严格要求: spctl --assess --verbose=4 --type execute MyApp.app ...我得到的结果是:
MyApp.app: a sealed resource is missing or invalid

对我来说似乎不够详细!我可能做错了什么?或者如何获取更多信息?

关于“a sealed resource...”的SO/Google搜索涉及签名框架(我没有),或建议使用--force选项进行签名(我尝试过,但不起作用)。

1个回答

8
您不能使用--deep。虽然您需要签署嵌入式JRE,但它听起来像是正确的选项,但它不起作用。根据苹果文档
重要提示:虽然可以将--deep选项应用于签名操作,但不建议这样做。我们建议您在单个阶段内从内而外地签署代码(如Xcode自动执行)。仅在紧急维修和临时调整时使用--deep进行签名。
经过大量努力,我从各种教程中拼凑出了这个解决方案。其中这个是最有帮助的。这是我的最终解决方案,作为Ant脚本:
<!-- code sign -->
<exec executable="chmod">
    <arg line="a+w ${build.dir}/Mac/MyApp.app/Contents/PlugIns/jre"/>
</exec>

<apply executable="codesign"> <!-- note: this loops through the contents of dir -->
    <arg line="-f -s 'Developer ID Application: My Organization'"/>
    <fileset dir="${build.dir}/Mac/MyApp.app/Contents/PlugIns/jre" />
</apply>

<exec executable="codesign" dir="${build.dir}/Mac"> 
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app/Contents/PlugIns/jre"/>
</exec>

<exec executable="codesign" dir="${build.dir}/Mac"> 
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app/Contents/PlugIns/jre/Contents/_CodeSignature/CodeResources"/>
</exec>

<!-- also codesign anything else in _CodeSignature (see comments) -->

<exec executable="codesign" dir="${build.dir}/Mac">
    <arg line="-f -s 'Developer ID Application: My Organization' MyApp.app"/>
</exec>


<!-- verify codesign -->
<exec executable="codesign" dir="${build.dir}/Mac" failonerror="true">
    <arg line="-vv MyApp.app"/>
</exec>


<!-- verify gatekeeper -->
<exec executable="spctl" dir="${build.dir}/Mac" failonerror="true">
    <arg line="-vv --assess --type execute MyApp.app"/>
</exec>

另一件需要注意的事情是,在签名后不要使用命令行zip来打包应用程序,因为这会破坏应用程序的代码签名。您应该使用productbuild、PackageMaker、xip或者dmg进行打包。


非常感谢您的回复,真的非常感激。不幸的是,这只能到达验证阶段(codesign -vv MyApp.app行),然后出现错误信息 [exec] MyApp.app: code object is not signed at all / [exec] In subcomponent: MyApp.app/Contents/PlugIns/jre/Contents/_CodeSignature/CodeDirectory。有什么想法吗? - HughHughTeotl
1
@HughHughTeotl 当我运行它时,我没有得到 _CodeSignature/CodeDirectory -- 不确定是什么导致了这种差异。您必须签署 _CodeSignature 中的所有内容,因此只需将 _CodeSignature/CodeDirectory(和其中的任何其他内容)添加到列表中即可。此外,请确保您在 OS X 10.9 或更高版本中签名。如果使用旧版本的 OS X,则代码签名将无法工作。 - martinez314
太棒了!看起来可以了。我会编辑您的答案,加上这个小改动,这样我就可以接受它了(希望没问题)。非常感谢。 - HughHughTeotl
@HughHughTeotl 看起来这个编辑被拒绝了(不是我拒绝的)。我在答案里加了一条说明。谢谢! - martinez314

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