我为MacOS发行了Java应用程序,它是开发人员签署但未经公证的。由于文档非常偏向于使用我不使用的Xcode创建应用程序,因此我不太确定从哪里开始。我只是想以最简单的方法来公证我的应用程序并继续前进。
阅读文档时,我已经有一些担忧:
我当前正在使用Java 8,是否可以对Java 8应用程序进行公证,还是我需要迁移到Java 11?我宁愿不迁移到Java 11,因为这会在其他某些平台上引起问题支持。
我的dev Mac机器是旧的MacBook Pro,因此无法通过OSX El Capitan 10.11.6进行更新,我是否可以对此机器进行公证?我确实有一台较新的计算机,但未为开发设置该计算机,而且我对将开发人员ID证书转移到该计算机也有些担心,因为首先要进行设置是有问题的。
我使用AppBundler分支https://github.com/TheInfiniteKind/appbundler/打包我的应用
这由执行签名等操作的ant脚本构建文件调用,我们最终使用dmgCanvas创建dmg
我在下面发布了ant脚本,希望有人可以从基本步骤入手
#!/bin/bash
#set -x
cd /Users/paul/code/jthink/songkong/src/main/scripts
hiutil -C -fapplehelpbook/SongKongHelp/SongKongHelp.helpindex applehelpbook/SongKongHelp/
cd /Users/paul/code/jthink/songkong
rm -fr /Applications/SongKong.app
mvn clean
mvn -DskipTests=true install
rm -fr target/songkong-6.6
unzip target/songkong-6.6-distribution.zip -d target
ant
while read line; do
echo "$line"
if [[ "$line" = "<string>1.0</string>" ]]; then
cat mergefile.txt # or echo or printf your extra lines
fi
done < /Applications/SongKong.app/Contents/Info.plist > Info.new
while read line; do
echo "$line"
if [[ "$line" = "<false/></dict>" ]]; then
cat mergefile2.txt
fi
done < Info.new > Info.new2
rm /Applications/SongKong.app/Contents/Info.plist
rm Info.new
mv Info.new2 /Applications/SongKong.app/Contents/Info.plist
sudo cp -r target/songkong-6.6/applehelpbook/SongKongHelp /Applications/SongKong.app/Contents/Resources
rm /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/MacOS/libjli.dylib
cp /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/Home/jre/lib/jli/libjli.dylib /Applications/SongKong.app/Contents/PlugIns/jdk1.8.0_192.jdk/Contents/MacOS
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
/usr/bin/codesign --sign "Developer ID Application: P Taylor" --force --deep --verbose /Applications/SongKong.app
/usr/bin/codesign --verify --deep --verbose /Applications/SongKong.app
cd /Users/paul/code/jthink/SongKong
/usr/local/bin/dmgcanvas /Users/paul/code/jthink/SongKong/dmgCanvas_songkong.dmgCanvas /Users/paul/songkong-osx.dmg -v SongKong
答案 0 :(得分:1)
进行公证需要Xcode 10,而装订至少需要 Sierra 。
“公证需要Xcode 10或更高版本。构建用于公证的新应用需要macOS 10.13.6或更高版本。装订应用程序需要macOS 10.12或更高版本。” https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution
对于转移开发证书,让Xcode通过在旧计算机上导出配置文件并在新计算机上导入配置文件来处理此任务。
答案 1 :(得分:1)
AFAIK,您需要Java 11(请参阅JDK-8223671),但是最近I was told Java 8也可以使用。我没有尝试过。
JDK-8223671包含一些有用的信息。具体来说,您需要为代码签名调用添加权利:
codesign --entitlements java.entitlements --options runtime --deep -vvv -f --sign "Developer ID Application: Bla Bla (XXXX)" YourApp.app
一个有效的示例java.entitlements
文件可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<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/>
</dict>
</plist>
将jlink
生成的运行时捆绑在一起是一件很麻烦的事情,因为它包含符号链接(在签名过程中是不允许的)以及一个合法文件夹,其中包含诸如java.xml
的文件夹名称(带有.
)。 codesign
不幸的是有点笨,并且认为这样的文件夹是无法识别的捆绑包和异常终止。因此,您应该在重链接之前重命名这些文件/文件夹并解析所有sim链接。
如果使用jlink
,请确保添加所需的服务提供商,例如jdk.crypto.ec for HTTPS。另请注意,Java 11 TLSv1.3中的AFAIK至少已部分破坏(上传大文件),您应将其禁用,例如-Dhttps.protocols=TLSv1.1,TLSv1.2
。
如果使用AppBundler分支,则需要确保它也遵循Apple的准则,即与macOS 10.9链接。我相信默认情况下,AppBundler链接到10.7,但是更改它很简单。
如果使用Java 11或更高版本,请确保将libjli.dylib
捆绑在/Contents/PlugIns/JAVA_PLUGIN_NAME/Contents/Home/lib/jli/libjli.dylib
中。显然,启动器需要这样做,并且默认情况下可能不会将其捆绑在一起。
您的某些其他问题在Apple的guidelines中得到了回答:
公证需要Xcode 10或更高版本。构建用于公证的新应用需要macOS 10.13.6或更高版本。装订应用程序需要macOS 10.12或更高版本。
答案 2 :(得分:1)
关于Java 8-当我对包含Java 8的应用程序进行公证时,令我感到惊讶的是……刚刚生效-https://twitter.com/dan_gravell/status/1187000856186634246
编辑14/11/2018-事实证明这可能是针对旧版macOS SDK构建的JDK的临时延期-请参阅https://developer.apple.com/news/?id=09032019a。该缓刑将持续到2020年1月。
非常简单一旦有了DMG / ZIP进行公证,只有两个实际步骤:
我想对结果进行轮询可以认为是又一步。
我最大的问题是设置-您需要一个具有Apple ID的有效开发人员计划帐户(这很简单),但是,当您按照说明向钥匙串添加密码时,请使用应用专用密码< / em>。您还需要为您的Apple ID帐户启用两因素身份验证。
解决了命令行调用后,在构建脚本中实现自动化非常容易。
答案 3 :(得分:0)
在已发布的答案的帮助下,它起作用了,我还发现DmgCanvas的最新版本使它变得更容易了,这些都是我的步骤
相应地修改了构建脚本的结尾(将appSpecificPassword替换为我创建的
malloc
运行它并奏效,公证步骤花费了大约45分钟。