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