Java和Mojave的强化运行时

tre*_*esf 5 java security pkgbuild hardening macos-mojave

我目前分发Java应用程序,pkgbuild在macOS上使用打包和签名

苹果最近警告开发人员:

“在即将发布的macOS版本中,Gatekeeper将需要由开发人员ID签名的软件由Apple 进行公证。”

在阅读了经过公证的文档后,苹果警告开发人员

“您必须启用强化的运行时,Apple才能对您的应用程序进行公证。”

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

可能相关:如何为Xcode上的第三方CLI进行代码签名并启用强化的运行时?

tre*_*esf 8

我正在回答有关需要公证的Java项目的问题。稍作修改,答案就应该适用于其他类型的项目(python,powershell,node)。

注意:在发布此文件时,Apple的公证命令允许以下过程正常运行,但是由于公证和安全性变得越来越普遍并且更加严格地执行,Apple不可避免地会更改并改善强化要求和过程。请根据需要编辑,评论或重新回答。

代码签名

  • 对于香草Java应用程序(.pkg.app包含脚本,罐子),公证应通过。在公证过程中,Apple 提取.jar并寻找本机库。如果发现未签名的内容,它将被拒绝。如果没有,那么您就可以了。有关公证使用的说明,请参见xcrun下文。
  • 对于其中包含本地调用Java应用程序(如JNI)捆绑库(.dylib.jnilib)每个绑定的库必须使用“应用程序”(例如签字developerID_application.cer)证书。

    • 证书标识符和配置文件(单击“ iOS,tvOS,watchOS”下拉列表)macOS开发人员ID应用程序。(也可以说“ with Kext”)。 苹果开发者门户
    • 如果您没有此证书,则需要使用CSR申请一个证书。就我而言,我最初只有包装安装人员的证书(没有代码签名)。特别是如果您对两个证书使用相同的私钥,则此过程可能会很棘手。如果遇到问题,请openssl通过命令行(而不是Keychain Access)使用。
    • 获得证书后,对每个本机库.dylib|.jnilib|.so|bin 进行签名都会很棘手。通常的想法是codesign对本机库使用命令,以便您(开发人员)可以对其进行签名。语法为:

      xargs codesign -s "P6DMU6694X" -v dependency.dylib
      Run Code Online (Sandbox Code Playgroud)

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

    • 对于.jar文件,这可能特别麻烦,因为每个包都需要提取,签名然后压缩回来。

公证

  • 签署本机库后,必须使用来发送软件包以进行公证xcrun

    xcrun altool --eval-app --primary-bundle-id <捆绑ID> -u <iTunes Connect帐户> -f <文件路径>

    可能看起来像这样:

    xcrun altool --eval-app --primary-bundle-id com.domain.appname -u john@domain.com -f appname.pkg

  • 系统将提示您输入Apple Developer密码(而不是用于登录Mac的密码)。 编辑:由于已经强制使用双因素,因此您需要为此步骤创建应用专用密码

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

    RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6
    Run Code Online (Sandbox Code Playgroud)

  • 定期检查此唯一ID的状态,以查看其是否已获批准。
    xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u john@domain.com
    Run Code Online (Sandbox Code Playgroud)
  • 如果被拒绝,它们将不会直接告诉您原因,您必须解析JSON响应。

    LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/...
    Run Code Online (Sandbox Code Playgroud)

  • 阅读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
    }
    
    Run Code Online (Sandbox Code Playgroud)

装订

最后,装订版本可确保即使网络连接不可用,程序包也可信任。

(apple.com)您还应该使用装订器工具将票证附加到软件上,以便将来的发行版中包括票证。这样可以确保即使网络连接不可用,网闸也可以找到故障单。要将票证附加到您的应用程序,请使用装订器工具:

xcrun stapler staple appname.pkg
Run Code Online (Sandbox Code Playgroud)


Sea*_*lly 5

除了上面 tresf 的回答之外,如果您的应用程序被沙箱化(即使没有),那么在加载 JVM 时强化运行时将失败。要解决这个问题,您需要在签名时为您的权利添加一些密钥。必要的权利条目如下,从 TAO ZHOU 的解决方案复制到这里:https : //github.com/TheInfiniteKind/appbundler/issues/39

<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
Run Code Online (Sandbox Code Playgroud)