Java和Mojave的强化运行时
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java和Mojave的强化运行时相关的知识,希望对你有一定的参考价值。
我目前在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项目,我正在回答这个问题。稍作修改,答案也适用于其他类型的项目(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”)。 如果您没有此证书,则需要使用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 john@domain.com -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 john@domain.com
- 如果被拒绝,他们将不会直接告诉您原因,您必须解析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 }
除了上面的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/>
以上是关于Java和Mojave的强化运行时的主要内容,如果未能解决你的问题,请参考以下文章
《DevOps实践:驭DevOps之力强化技术栈并优化IT运行》
节点应用程序无法在 mojave 上运行:ReferenceError: internalBinding 未定义
辅助功能检查器无法在 MacOS Catalina 和 Mojave 上的 Xcode 11.x、iOS 13.x 上运行