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更新不会阻止项目?
我正在回答有关需要公证的Java项目的问题。稍作修改,答案就应该适用于其他类型的项目(python,powershell,node)。
注意:在发布此文件时,Apple的公证命令允许以下过程正常运行,但是由于公证和安全性变得越来越普遍并且更加严格地执行,Apple不可避免地会更改并改善强化要求和过程。请根据需要编辑,评论或重新回答。
.pkg或.app包含脚本,罐子),公证应通过。在公证过程中,Apple 将提取.jar并寻找本机库。如果发现未签名的内容,它将被拒绝。如果没有,那么您就可以了。有关公证使用的说明,请参见xcrun下文。对于其中包含本地调用Java应用程序(如JNI)捆绑库(.dylib,.jnilib)每个绑定的库必须使用“应用程序”(例如签字developerID_application.cer)证书。

openssl通过命令行(而不是Keychain Access)使用。获得证书后,对每个本机库.dylib|.jnilib|.so|bin 进行签名都会很棘手。通常的想法是codesign对本机库使用命令,以便您(开发人员)可以对其进行签名。语法为:
xargs codesign -s "P6DMU6694X" -v dependency.dylibRun 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-a1b2c3d4e5f6Run Code Online (Sandbox Code Playgroud)xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u john@domain.comRun 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)
除了上面 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)