Java 和 Mojave 的强化运行时

2023-11-27

我目前分发一个 Java 应用程序,打包并签名 using pkgbuild在 macOS 上。

最近,苹果警告开发者:

“在即将发布的 macOS 版本中,Gatekeeper 将要求开发人员 ID 签名的软件经过公证的由苹果公司。”

阅读公证文件后,苹果警告开发商:

“您必须启用硬化运行时让您的应用程序得到 Apple 的公证。”

其中详细介绍了如何在 Xcode 中打开这些设置。但是那些不是用 Xcode 开发的应用程序呢?Xamarin/Mono 有一些来回关于他们如何解决这个问题,但到目前为止的提交似乎集中在 Mojave 检测和 C/C++ 上。 Java 应用程序或不分发任何 C/C++/Objective-C 编译代码的应用程序怎么样?项目如何进行“公证”,以免被未来的 macOS 更新阻止?

可能相关:如何在 Xcode 上共同设计并启用第 3 方 CLI 的强化运行时?


我正在回答这个关于需要公证的Java项目的问题。经过轻微修改,答案应该也适用于其他类型的项目(python、powershell、node)。

Note:在发布本文时,Apple 的公证命令允许以下程序运行,但是随着公证和安全性变得更加普遍且执行更加严格,Apple 将不可避免地更改和改进强化要求和程序。请根据需要进行编辑、评论或重新回答。

代码签名

  • 对于普通 Java 应用程序 (.pkg or .app包含脚本、jar),公证应该通过。在公证过程中,Applewill提取.jar并寻找本机库。如果发现任何未签名的内容,则会被拒绝。如果没有,那就没事了。公证使用说明xcrun进一步如下。
  • 对于包含对捆绑库的本机调用(例如 JNI)的 Java 应用程序(.dylib, .jnilib)每个捆绑库必须使用“应用程序”进行签名(例如developerID_application.cer) 证书。

    • Certificates, Identifiers & Profiles, (Click "iOS, tvOS, watchOS" dropdown) macOS, Developer ID Application. (may also say "with Kext"). apple developer portal
    • 如果您没有此证书,则需要使用 CSR 申请一个证书。就我而言,我最初只有打包安装程序的证书(而不是协同设计)。此过程可能会变得棘手,特别是如果您对两个证书使用相同的私钥。使用openssl通过命令行(而不是Keychain Access)如果你被卡住了。
    • 获得证书后,对每个本机库进行签名.dylib|.jnilib|.so|bin 变得棘手。总体思路是使用codesign针对本机库的命令,以便它以您(开发人员)的身份进行签名。语法是:

      xargs codesign -s "P6DMU6694X" -v dependency.dylib

      ... 在哪里P6DMU6694X是唯一的开发人员 ID 或确切的证书通用名称(都可以)。

    • For a .jar文件,这可以是特别麻烦因为每个包都需要被提取、签名然后压缩回来。

公证

  • 对本机库进行签名后,必须使用以下方式发送包进行公证xcrun.

    
    xcrun altool --eval-app --primary-bundle-id <bundle id> -u <iTunes Connect Account> -f <file path>  

    可能看起来像这样:

    
    xcrun altool --eval-app --primary-bundle-id com.domain.appname -u [email protected] -f appname.pkg  
  • 系统将提示您输入 Apple 开发者密码(NOT您用于登录 Mac 的密码)。Edit:由于双因素已被强制执行,您需要创建一个应用程序专用密码为了这一步!

  • 几分钟后,xcrun命令将返回一个唯一的 ID,可用于确定公证是否获得批准。

    RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6
  • 定期检查此唯一 ID 的状态,看看它是被批准还是被拒绝。
    xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u [email protected]
  • 如果被拒绝,他们不会直接告诉你原因,你必须解析 JSON 响应。

    LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/...
  • 阅读 JSON 并纠正发现的问题。 JSON 已缩小,您可能希望通过漂亮的格式化程序运行它。如果没有问题,则您的应用已经过公证并且可以使用Ready for distribution.

    
    {
      "logFormatVersion": 1,
      "jobId": "a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6",
      "status": "Accepted",
      "statusSummary": "Ready for distribution",
      "statusCode": 0,
      "archiveFilename": "appname.pkg",
      "uploadDate": "2018-10-26T05:41:12Z",
      "sha256": "e2350bda66...",
      "issues" null
    }
    

Stapling

最后,装订构建将确保即使网络连接不可用,包也是可信的。

(apple.com) 您还应该使用订书机工具将票证附加到您的软件中,以便将来的发行版包含票证。这可以确保即使网络连接不可用,Gatekeeper 也可以找到票证。要将票证附加到您的应用程序,请使用订书机工具:

xcrun stapler staple appname.pkg

Runtime

@NaderNader 提供的附加解决方案,如果将 Java 运行时与.app,需要额外的步骤来将分布标记为runtime使用--option=runtime标志,在哪里P6DMU6694X是您的签名 ID:

codesign --force --deep --options=runtime -s "P6DMU6694X" /path/to/My.app
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 和 Mojave 的强化运行时 的相关文章

  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • WinForms - 哪种是保存某些数据最简单的方法?

    刚刚构建我的第一个 WinForms 应用程序 问题 在使用应用程序之间保存一些数据的最简单 最佳方法是什么 例如 在本例中包含状态和日期 时间的 URL 列表 我认为不需要数据库 例如 仅仅存储到文本文件是最简单的吗 或者在 DotNet
  • UseWindowsAzureActiveDirectoryBearerAuthentication 如何验证令牌?

    我按照下面的 GitHub 示例来实现跨 WebApp 和 WebApi 的身份验证机制 https github com AzureADSamples WebApp WebAPI OpenIDConnect DotNet 我正在为 Web
  • Angular 圆形模块导入

    我有两个模块 其组件相互使用 所以我必须在 test 中导入 word 在 word 中导入 test gt 抛出错误 我该怎么办 模块 测试 NgModule declarations AppTest1Component AppTest2
  • Websphere 所有日志都将转到 SystemOut.log

    我在我的应用程序中使用 Log4j 并有一些用于调试和错误的附加程序 我在tomcat上测试过 工作正常 在各自的文件中生成所有日志 但是当我在 WAS6 1 上部署代码时 所有日志仅在 SystemOut log 内生成 请帮忙 问题可能
  • VS 11 Beta 无法启动进程,因为尚未提供文件名

    这是我构建测试项目时得到的结果 这样我就无法运行我的测试 因为 VS 没有发现它们 查看留言 Unexpected error detected Check the Tests Output Pane for details 在窗口底部 现
  • 我怎样才能让 gitbash 找到 javac 命令?

    我创建了我的 git 存储库并提交了它 插入一个java文件并想要编译它 但它给了我这个 Bernard BERNARD PC c users bernard desktop git2 master javac TestGUI java s
  • Clang 链接器问题(从源代码到 gcc-snapshot)

    我似乎无法让它发挥作用 我配置了 with gcc toolchain 在 equals 之后我把 gcc 所在的目录 usr lib gcc snapshot bin 我还查看了 clang 链接器问题 但我不知道如何获得接受的答案来找到
  • Volley Android 网络库

    关于在我的项目中使用 Volley 我有几个问题 这个库可以在任何 Java 项目中使用还是只能在 Android 项目中使用 我看到多个分支here并且没有关于从哪个分支开始的文档 我应该从哪个分支开始 您如何将该库集成到您自己的项目中
  • Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值

    我正在尝试取消我的asyncTypescript 中的方法调用 为此 我创建了一个新的 Promise 类型 它继承自Promise class CancelablePromise
  • 考虑每行上所有可能的排列,查找元胞数组的唯一行

    我有元胞数组A维度的m k 我想保留行A unique 最多为 k 个单元格 棘手 的部分是 最多为 k 个单元格 考虑k细胞中的i第 行A A i 可能会有一排j of A A j 这相当于A i 直到重新排序k细胞 这意味着例如如果k
  • git-创建一个分支,稍后将推送到远程

    我有一个脚本 它会自动创建一个新分支 其名称基于外部信息 JIRA 票证 在提交并推送一些代码之前我不想创建远程分支 但我不想必须执行 git push set upstream origin 换句话说 我想在推送之前设置上游 git ch
  • 如何加密密码以便稍后将其保存在数据库或文本文件中?

    我希望我的应用程序将加密的密码保存在数据库或文本文件中 假设任何人都可以打开数据库或文本文件 我该如何做到这一点 复制 加密 散列数据库中的纯文本密码 不重复我要求提供特定于 NET 的代码 编辑 我正在保存密码以供以后使用 我需要对其进行
  • 创建单个 python 可执行模块

    伙计们 我在模块中有很多 python 代码 这些代码驻留在多个 python 包中 现在我需要创建单个 python 可执行模块或文件 其中将包含所有这些文件 因此它将在 Windows 和 Linux 服务器上运行 有哪些可能的解决方案
  • 用默认值初始化字段是多余的

    我真的可以信任 NET 来初始化字段 如整数 结构等 吗 如果我仍然想初始化这些字段怎么办 会产生什么影响 The C 规范第 305 页上的说明 17 4 4 字段的初始值 无论是静态字段还是实例字段 都是该字段的默认值 第 12 2 节
  • GWT 日志记录设置

    我正在使用 GWT 2 1 java util logging仿真记录客户端消息 根据文档 提供了两个适用于客户端日志记录的格式化程序 TextFormatter 和 HTMLFormatter 任何人都可以提供有关如何设置格式化程序并将其
  • 我正在尝试复制文件,但收到错误消息

    我是 postgres 的新手 可能缺少一些愚蠢的东西 例如 我的目录的正确名称 有人可以指导我吗 我正在遵循 Anthony DeBarros 的 实用 SQL 一书的说明 Code copy us counties 2010 from
  • easy_install-2.7 的问题

    安装 easy install 并尝试使用它来安装 python 包后 它失败了 root server easy install 2 7 pip Searching for pip Reading http pypi python org
  • android 设置特定时间通知

    我意识到这个问题以前已经被问过 但我对这个问题一筹莫展 我有一个警报管理器来设置通知 public void to reminder View view Intent intent new Intent this Notification
  • 从向量创建Mat

    我对计算机视觉和 opencv 库非常陌生 我已经进行了一些谷歌搜索 试图找到如何从 Point2fs 向量制作新图像 但没有找到任何有效的示例 我见过vector
  • Java 和 Mojave 的强化运行时

    我目前分发一个 Java 应用程序 打包并签名 using pkgbuild在 macOS 上 最近 苹果警告开发者 在即将发布的 macOS 版本中 Gatekeeper 将要求开发人员 ID 签名的软件经过公证的由苹果公司 阅读公证文件