Java和Mojave的强化运行时

问题描述 投票:4回答:2

我目前在macOS上使用packaged and signed分发Java应用程序pkgbuild

最近,Apple警告开发者:

“在即将发布的macOS版本中,Gatekeeper将要求开发者ID签名的软件由Apple提供notarized。”

在阅读公证文件后,苹果warns developers

“你必须启用hardened runtime才能让你的应用程序被Apple公证。”

其中详细介绍了如何在Xcode中切换这些设置。但是不是用Xcode开发的应用程序呢? Xamarin/Mono have some back and forth关于他们如何处理这个问题,但到目前为止提交的内容似乎都集中在Mojave检测和C / C ++上。那些不分发任何C / C ++ / Objective-C编译代码的Java应用程序或应用程序呢?项目如何得到“公证”,以便它不会被未来的macOS更新阻止?

可能相关:How to codesign and enable the hardened runtime for a 3rd-party CLI on Xcode?

java security macos-mojave pkgbuild hardening
2个回答
5
投票

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

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

Code Signing

  • 对于一个vanilla Java应用程序(包含脚本,jar的.pkg.app),公证应该通过。在公证期间,Apple将提取.jar并寻找本地库。如果发现任何未签名的内容,则会被拒绝。如果没有,你没事。使用xcrun进行公证的说明如下。
  • 对于包含对捆绑库(.dylib.jnilib)的本机调用(例如JNI)的Java应用程序,必须使用“应用程序”(例如developerID_application.cer)证书对每个捆绑库进行签名。 证书,标识符和配置文件,(点击“iOS,tvOS,watchOS”下拉列表)macOS,开发者ID应用程序。 (也可以说“与Kext”)。 apple developer portal 如果您没有此证书,则需要使用CSR申请。就我而言,我最初只有包装安装人员的证书(不是代码签名)。如果您对两个证书使用相同的私钥,则此过程可能会变得棘手。如果卡住,请通过命令行(而不是openssl)使用Keychain Access。 获得证书后,签署每个本地库.dylib|.jnilib|.so|bin gets tricky。一般的想法是对本机库使用codesign命令,以便它作为开发人员签名。语法是: xargs codesign -s "P6DMU6694X" -v dependency.dylib ...其中P6DMU6694X是唯一的开发者ID或确切的证书Common Name(要么工作)。 对于.jar文件,这可以是particularly cumbersome,因为每个包需要被提取,签名然后压缩回来。

Notarization

  • 签署本机库后,必须使用xcrun发送包进行公证。 xcrun altool --eval-app --primary-bundle-id <bundle id> -u <iTunes Connect帐户> -f <文件路径> 这看起来像这样: xcrun altool --eval-app --primary-bundle-id com.domain.appname -u [email protected] -f appname.pkg
  • 系统将提示您输入Apple Developer密码(不是用于登录Mac的密码)。编辑:由于已经强制要求双因素,因此您需要为此步骤创建一个app-specific password
  • 几分钟后,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 }

1
投票

除了上面的tresf答案之外,如果您的应用程序是沙箱(可能即使没有),那么加载JVM时加固的运行时将失败。要解决此问题,您需要在签名时为权利添加一些密钥。下面是必要的权利条目,复制自TAO ZHOU的解决方案:https://bitbucket.org/infinitekind/appbundler/issues/39/build-with-hardened-runtime

<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/>
© www.soinside.com 2019 - 2024. All rights reserved.