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

时间:2019-10-24 20:29:51

标签: java macos notarize

我为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
    

4 个答案:

答案 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月。

在步骤方面,我发现遵循https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow

非常简单

一旦有了DMG / ZIP进行公证,只有两个实际步骤:

  1. 发送公证请求
  2. 如果成功,则对结果进行装订

我想对结果进行轮询可以认为是又一步。

我最大的问题是设置-您需要一个具有Apple ID的有效开发人员计划帐户(这很简单),但是,当您按照说明向钥匙串添加密码时,请使用应用专用密码< / em>。您还需要为您的Apple ID帐户启用两因素身份验证。

解决了命令行调用后,在构建脚本中实现自动化非常容易。

答案 3 :(得分:0)

在已发布的答案的帮助下,它起作用了,我还发现DmgCanvas的最新版本使它变得更容易了,这些都是我的步骤

  • 设置新机器(设置src代码ectera)
  • 更新为Java 8的最新版本(jdk1.8.0_231.jdk)
  • 安装XCode,然后转到“偏好设置:下载”,然后选择“安装命令行工具”
  • 使用KeyChain导出开发人员ID证书作为.p12格式并导入到新计算机中
  • 购买并安装DmgCanvas 3($ 30USD)
  • 续订Apple开发者帐户
  • 为我的AppleId帐户设置两步授权(部分在网站上完成,部分在iCloud应用中完成)
  • 创建应用专用密码(做笔记请稍后使用)
  • 相应地修改了构建脚本的结尾(将appSpecificPassword替换为我创建的

    malloc

运行它并奏效,公证步骤花费了大约45分钟。