为 MacOS Catalina 公证现有的 Java 应用程序

Pau*_*lor 7 java macos notarize

我为 MacOS 分发了一个 Java 应用程序,它经过开发人员签名但未经过公证。不确定从哪里开始,因为文档太偏向于使用我不使用的 Xcode 创建应用程序,但我只想用最简单的方法来公证我的应用程序,然后继续。

阅读文档我已经有一些担忧:

  • 我目前正在使用 Java 8,是否可以对 Java 8 应用程序进行公证,或者我是否需要迁移到 Java 11。我宁愿不迁移到 Java 11,因为它会在我支持的其他一些平台上引起问题。

  • 我的开发 Mac 机器是旧的 MacBook Pro,因此无法更新到 OSX El Capitan 10.11.6 之后,我可以用这台机器公证吗?我确实有一台更新的机器,但它没有设置用于开发,我对将 Developer Id 证书转移给它有一些担忧,因为首先设置它是有问题的。

  • 我使用 AppBundler fork https://github.com/TheInfiniteKind/appbundler/来打包我的应用程序

  • 这由执行签名等操作的 ant 脚本构建文件调用,我们最终使用 dmgCanvas 创建了一个 dmg

  • 我在下面发布了蚂蚁脚本,希望有人可以从基本步骤开始

    #!/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
    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
    
    Run Code Online (Sandbox Code Playgroud)

Dan*_*ell 7

编辑 12/2/2020 - 由于 Apple 慢慢收紧了公证要求,因此发生了很多变化。从 2 月 3 日开始,它们似乎已经进入最后阶段,这意味着您的应用程序必须满足更高的要求,包括针对最新 SDK 构建的 JRE,并具有“强化运行时”支持。

所以我删除了很多旧的讨论。

我的第一个问题是设置 - 您需要一个带有 Apple ID 的有效开发者计划帐户(这很容易),但是,当您按照说明向钥匙串添加密码时,请使用App 特定密码。您还需要为您的 Apple ID 帐户启用双重身份验证。

一旦您计算出命令行调用,就很容易在构建脚本中实现自动化。我曾经jpackage创建过应用程序和 DMG,但要注意 -目前它对应用程序进行签名的方法不起作用

在脚本方面,以下是我对适合公证的应用程序进行代码签名的操作(假设 a.app已创建):

% security unlock-keychain -p passwordhere codesigning.keychain
% find my-app.app -type f \
  -not -path "*/Contents/runtime/*" \
  -not -path "*/Contents/MacOS/my-app" \
  -not -path "*libapplauncher.dylib" \
  -exec codesign --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain {} \;

% find my-app.app/Contents/runtime -type f \
  -not -path "*/legal/*" \
  -not -path "*/man/*" \
  -exec codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain {} \;

% codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain my-app.app/Contents/runtime

% codesign -f --timestamp --entitlements /tmp/bliss.entitlements -s "XXX" --prefix com.myapp. --options runtime -v --keychain /path/to/codesigning.keychain my-app.app
Run Code Online (Sandbox Code Playgroud)

权利应该是:

<?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>
Run Code Online (Sandbox Code Playgroud)

所有测试都有效:

% codesign -vvv --deep --strict my-app.app/Contents/runtime 
my-app.app/Contents/runtime: valid on disk
my-app.app/Contents/runtime: satisfies its Designated Requirement
% codesign -vvv --deep --strict my-app.app/                
--prepared:/private/tmp/my-app.app/Contents/MacOS/libapplauncher.dylib
--validated:/private/tmp/my-app.app/Contents/MacOS/libapplauncher.dylib
my-app.app/: valid on disk
my-app.app/: satisfies its Designated Requirement
% spctl -a -t exec -vv my-app.app          
my-app.app: accepted
source=Developer ID
origin=XXX
Run Code Online (Sandbox Code Playgroud)

此时,您还应该尝试运行您的应用程序 - 代码签名过程可能会破坏一些事情。

从这里,您可以创建一个 DMG(我再次使用jpackage),这应该通过公证。

总之:

  1. 以正确的结构构建应用程序
  2. 创建权利文件
  3. 代码签名你的代码
  4. 对捆绑运行时内的文件进行代码签名,强制签名
  5. 对捆绑的运行时本身进行代码签名
  6. 代码签名您的应用程序文件
  7. 打包成 DMG
  8. 公证
  9. 装运它


Pau*_*lor 1

截至 2020 年 2 月 3 日更新 Apple 收紧了公证要求,答案重写。

注意:我需要 AdoptJdk Java 11.0.7 JRE,早期版本不适合我。

这是我的步骤

  • 设置新机器(设置源代码等)
  • 安装 XCode,然后转到“首选项:下载”并选择“安装命令行工具”
  • 使用KeyChain导出开发者ID证书为.p12格式并导入到新机器中
  • 购买并安装 DmgCanvas 3(30 美元)
  • 续订Apple开发者帐户
  • 为我的 AppleId 帐户设置两步授权(部分通过网站完成,部分通过 iCloud 应用完成)
  • 创建应用程序特定密码(记下 dmgCanvas 选项所需的密码)
  • 安装AdoptJdk Java 11.0.7进行构建
  • 安装 AdoptJdk Java 11.0.7 JRE 以在应用程序内捆绑
  • 创建songkong.entitlements文件
  • 配置 Appbundler InfiniteKind 分支使用的 build.xml 文件以直接引用 AdoptOpenJDK JRe 构建
  • 配置构建脚本以对 appbundler 创建的包进行签名,确保我们使用所需的新签名选项(例如 -runtime、--entitlements、--timestamp)
  • 然后,构建脚本使用 dmgCanvas 创建 dmg,这还会对 dmg 进行签名并将其发送给 Apple 进行公证

build.xml 包括:

<runtime dir="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jre/Contents/Home"/>
Run Code Online (Sandbox Code Playgroud)

buildosx.sh 是

#!/bin/bash
#set -x

cd /Users/paul/code/jthink/songkong
sudo rm -fr /Applications/SongKong.app
mvn -f pommacos.xml -DskipTests=true install
rm -fr target/songkong-6.9
unzip target/songkong-6.9-distribution.zip -d target
ant
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
/usr/bin/codesign --timestamp --options runtime \
--entitlements /Users/paul/code/jthink/songkong/songkong.entitlements \
--sign "Developer ID Application: P Taylor" \
--force --deep --verbose /Applications/SongKong.app
/usr/bin/codesign -vvv --deep --strict /Applications/SongKong.app
spctl -a -t exec -vv /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 -identity "Developer ID Application: P Taylor" \
 -notarizationAppleID paultaylor@jthink.net \
 -notarizationPassword password \
 -notarizationPrimaryBundleID songkong
Run Code Online (Sandbox Code Playgroud)

SongKong权利文件是:

<?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>
Run Code Online (Sandbox Code Playgroud)

注意:我还参考 AdoptJdk Java 11.0.7 JDK build.xml 进行了尝试,并且构建也没有问题(尽管最终会产生更大的 dmg)