当前位置: 首页 > 面试题库 >

适用于OS X Gatekeeper的代码签名Java应用

宓昂雄
2023-03-14
问题内容

我正在尝试将Java应用程序分发给OS X用户。我不使用Mac商店-可以通过我自己的网站进行分发。无论我如何尝试,OS
X的Gatekeeper都会拒绝该应用程序。

这是我的方法:

(1)像往常一样构建应用程序,获取一个JAR文件

(2)appbundler按此处所述使用:https
:
//docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html。这会在我的JAR周围创建一个.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

对我来说似乎不是很冗长!我可能做错了什么?或者我如何获得更多信息?

SO / Google围绕“密封资源…”搜索是指签名框架(我没有)或建议使用--force选项签名(我尝试过但无法使用)。


问题答案:

您不能使用--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 将其打包。



 类似资料:
  • 是否有工具和行业标准来确保和验证补丁或系统更新的完整性。作为发布过程的一部分,有时我会向基于ColdFusion/HTML/JS的应用程序交付更新集。我的问题是,我是否真的可以对软件包或单个更新进行即时签名,然后在安装之前让ColdFusion/application server自动验证它们。 请注意,有时我需要向单个JS文件提供更新,有时需要向一组ColdFusion、cfc/cfm文件提供更

  • 代码签名是一种用来证明应用是由你创建的一种安全技术。 在macOS系统中,系统可以区分开应用的变更是偶然产生的,还是被恶意代码生成的。 在Windows系统中,如果程序没有代码签名证书,或者代码签名授信级别较低时,系统同样会将其列为可信程序,只是当用户运行该应用时,系统会显示安全提示。 确立授信级别的过程比较费时,因此最好提早开始着手代码签名的工作。 即使开发者可以发布一个未签名的应用程序,但是我

  • 代码签名是一种用来证明应用是由你创建的一种安全技术。 macOS 系统能通过代码签名检测对app的任何修改,包括意外修改和来自恶意代码的修改。 在Windows系统中,如果程序没有代码签名证书,或者代码签名授信级别较低时,系统同样会将其列为可信程序,只是当用户运行该应用时,系统会显示安全提示。 信任级别随着时间的推移构建,因此最好尽早开始代码签名。 即使开发者可以发布一个未签名的应用程序,但是我们

  • 问题内容: 13在我的本地设置中开始表现出非常奇怪的行为。 即,在添加到现有项目中的任何新类中,均不起作用。因此,在新类中声明任何类型的对象变量,然后键入该变量的名称,然后键入点号(。)之后,对于相应对象的任何方法都没有建议。 例如,在声明之后 键入不会显示该类中所有方法的列表,以便从中选择一个。实际上,当键入点(。)时,没有任何建议出现,并且在IDE窗口的左下角(状态栏中),显示消息“期望的标识

  • 我试图解决这个问题:https://leetcode.com/problems/palindrome-number/使用代码: 并在C中得到了这个错误: 但同样的代码在Java中运行得很好。为什么会这样?我该如何修复它?

  • 我正在尝试使用预先签名的URL将文件直接上传到S3,但无法让它工作,检查了所有相关帖子,但找不到任何解决方案。我能够在另一个项目中通过角上传,下面的代码正在工作。 然而,现在我试图用Ajax获得相同的输出,但我得到了403。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。 这是不起作用的代码: 请帮帮忙