8

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

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

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

  • 我的开发 Mac 机器是旧的 MacBook Pro,因此无法在 OSX El Capitan 10.11.6 之后更新,我可以用这台机器进行公证吗?我确实有一台更新的机器,但它不是为开发而设置的,我对将开发人员 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
    
4

4 回答 4

8

编辑 12/2/2020 - 发生了很多变化,因为苹果已经慢慢收紧了公证的要求。从 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

权利应该是:

<?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>

所有测试都有效:

% 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

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

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

总之:

  1. 以正确的结构构建应用程序
  2. 创建权利文件
  3. 对您的代码进行代码签名
  4. 对捆绑运行时中的文件进行代码签名,强制签名
  5. 对捆绑的运行时本身进行代码签名
  6. 对您的应用文件进行代码签名
  7. 打包成 DMG
  8. 公证它
  9. 装运它
于 2019-10-25T06:49:27.500 回答
3
  • AFAIK,您需要 Java 11(请参阅JDK-8223671),但是,最近有人告诉我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(带有 a .)。codesign不幸的是有点愚蠢,并认为此类文件夹是无法识别的捆绑包和中止。因此,您应该在 jlinking 之前重命名这些文件/文件夹并解析任何 sim 链接。

  • 如果您使用jlink,请确保添加所需的服务提供者,例如用于 HTTPS 的 jdk.crypto.ec。另请注意,AFAIK,在 Java 11 TLSv1.3 中至少部分损坏(上传大文件),您应该禁用它,例如使用-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 的指南中回答了您的其他一些问题:

公证需要 Xcode 10 或更高版本。构建新的公证应用程序需要 macOS 10.13.6 或更高版本。装订应用程序需要 macOS 10.12 或更高版本。

于 2019-10-25T06:47:52.500 回答
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 通过在旧机器上导出您的配置文件并在新机器上导入它来处理此任务。

于 2019-10-24T21:20:45.980 回答
1

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

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

这是我的步骤

  • 设置新机器(设置 src 代码等)
  • 安装 XCode 然后转到 Preferences:Downloads 并选择 Install Command Line Tools
  • 使用 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 fork 使用的 build.xml 文件以直接引用 AdoptOpenJDK JRe 构建
  • 配置构建脚本以对 appbundler 创建的包进行签名,确保我们使用所需的新签名选项(例如 -runtime、--entitlements、--timestamp)
  • 然后构建脚本使用 dmgCanvas 创建一个 dmg,这会另外对 dmg 进行签名并将其发送给 Apple 进行公证

build.xml 包括:

<runtime dir="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jre/Contents/Home"/>

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

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>

注意:我也参考 AdoptJdk Java 11.0.7 JDK build.xml 进行了尝试,并且也可以毫无问题地构建(当然最终会得到更大的 dmg)

于 2019-11-13T14:37:43.020 回答