适用于Java和Mojave的强化运行时

时间:2018-10-21 03:03:37

标签: java security macos-mojave pkgbuild hardening

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

最近,苹果警告开发人员:

  

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

阅读公证文档,苹果warns developers

  

“您必须为您的应用启用hardened runtime才能被Apple公证。”

其中详细介绍了如何在Xcode中启用这些设置。但是,那些不是用Xcode开发的应用程序呢? Xamarin/Mono have some back and forth关于他们如何解决这个问题,但到目前为止,提交似乎集中在Mojave检测和C / C ++。 Java应用程序或不分发任何C / C ++ / Objective-C编译代码的应用程序呢?如何对项目进行“公证”,以使其不会被以后的macOS更新所阻止?

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

3 个答案:

答案 0 :(得分:4)

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

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

代码签名

  • 对于普通的Java应用程序(包含脚本,罐子的.pkg.app),应通过公证。在公证过程中,Apple 将提取.jar并查找本机库。如果发现未签名的内容,它将被拒绝。如果没有,那么您就可以了。下面进一步介绍了使用xcrun进行公证的说明。
  • 对于包含对绑定库(.dylib.jnilib)的本地调用(例如JNI)的Java应用,必须使用“应用程序”(例如{{1 }})证书。

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

      codesign

      ...,其中xargs codesign -s "P6DMU6694X" -v dependency.dylib是唯一的开发人员ID或确切的证书公用名(两者都可以)。

    • 对于P6DMU6694X文件,该文件可以为particularly cumbersome,因为每个软件包都需要提取,签名然后重新压缩。

公证

  • 对本机库进行签名后,必须使用.jar发送该包以进行公证。

    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 john@domain.com -f appname.pkg

  • 将会提示您输入Apple Developer密码(用于登录Mac的密码)。 编辑:由于已强制采用双重因素,因此您需要为此步骤创建app-specific password

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

    xcrun

  • 定期检查此唯一ID的状态,以查看其是否已获批准。
    RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6
  • 如果被拒绝,它们将不会直接告诉您原因,您必须解析JSON响应。

    xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u john@domain.com

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

    Ready for distribution

答案 1 :(得分: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/>

答案 2 :(得分:1)

这是一个简单的shell脚本,它将对jar文件中的.so,.dylib和.jnilib进行代码签名

用法:codesign_jar_script.sh filename.jar

jar tf $1 | grep '\.so\|\.dylib\|\.jnilib'  > filelist.txt

IDENTITY="your_signing_identity"

echo $IDENTITY

while read f
do
    jar xf $1 $f
    codesign --force -s "$IDENTITY" -v $f
    jar uf $1 $f
    rm -rf $f
done < filelist.txt