【问题标题】:How to preserve alias property while signing app?签署应用程序时如何保留别名属性?
【发布时间】:2013-11-25 10:45:57
【问题描述】:

我在 Mavericks 的 JavaFX 应用程序上创建并使用 Xcode 5.0.2 签名 -

codesign --deep -s "my name" MayApp.app
codesign -v MayApp.app && echo MayApp.app is Signed Successfully!

没有签名 MYAPP 启动正常!!

如果不使用 --deep,我无法在 Mavericks 签署应用程序。

-- 更多尝试--

现在在 Mavericks,如果包中的任何嵌套包未签名,我们将无法再对包进行签名。我确实按照写在 - http://furbo.org/2013/10/17/code-signing-and-mavericks/

的说明签署了我的应用程序的框架
codesign --verbose --force --sign "my name" MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk

单独或在签署框架后签署框架命令,不会对签署应用程序进行任何更改。

-----主要问题------

在运行上述命令时(无论是仅签署应用程序还是与框架签署一起),MyApp.app 已成功签署,但 应用程序未在 Mac 上启动,因为签署命令未保留文件 libjli 的 ALIAS 属性.dylib 存在于 - MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS。签名应用代码将 libjli.dylib 别名转换为动态库。

然后我想到了通过以下命令复制 libjli.dylib -

<target name="Copylib" depends="SigningApp">
<delete file="MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS/libjli.dylib"/>
<exec executable="cp">
   <arg line="-R /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/MacOS/ MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS"/>
</exec>
</target>

这个保留别名,但现在在验证签名应用时说 -

admins-iMac:osx admin$ codesign -v -v MyApp.app
MyApp.app: code object is not signed at all
In subcomponent: MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk
In architecture: x86_64

如果我在 MyApp.app 中手动复制该别名,也会发生同样的情况。

请建议任何方式来签署应用程序并保留我的框架中存在的所有文件的属性 - Contents/PlugIns/jdk1.7.0_21.jdk

谢谢

【问题讨论】:

    标签: java xcode code-signing osx-mavericks codesign


    【解决方案1】:

    我的问题通过将 Java 从 jdk7u21 更新到最新的 jdk7u45 得到解决,因为 Oracle 的 Java 版本 7u25 及更低版本已被 Apple 在 OS X 上禁用。更新到最新版本将允许 Java 在 Mac OS X 上运行。

    此外,我必须进行这些更改以使应用程序有效签名 -

    1. MyApp.app/Contents/Info.plist 中,CFBundleExecutable 到 MyApp,CFBundleIconFile 到 MyApp.icns。
    2. 需要将/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/MacOS/libjli.dylib复制到MyApp.app/Contents/PlugIns/jdk1.7.0_45 .jdk/Contents/MacOSlibjli.dylib 别名。
    3. 我们还需要将 /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Info.plist 从系统安装的 jdk 复制到我们的 MyApp.app/Contents/PlugIns /jdk1.7.0_45.jdk/Contents/

    注意:第 2 步和第 3 步是必需的,因为在部署 JavaFx 应用时,部署过程默认仅将 /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home 复制到 MyApp.app/Contents/PlugIns ,它正在跳过 MacOS/ 文件夹和 Info.plist。

    如果不使用 -

    对应用签名进行上述更改
    codesign --deep -s "my name" MayApp.app
    

    我在签名时出错 - MyApp.app: bundle format unrecognized, invalid, or unsuitable - 我们正面临这个问题,所以我们需要确定是什么导致 app bundle 格式无法识别、无效、或不合适。

    谢谢

    【讨论】:

    • 我想知道这个解决方案是否适用于我尝试在山狮下签署 java 应用程序的情况。它一直说,'代码已经签名',但是当检查它说无效的签名属性.. :( 升级 JDK 后我会在这里报告结果
    • @swdev 请让我知道升级前您的 Mountain Lion OS X 的 xcode 和 java 版本是多少?
    • 感谢尼拉姆的回答,解决方案很简单。我只是使用codesign -f -s "Eko Wibowo",强制签名,关于包裹是否签名。其实我还没签。但是,使用 -f 选项解决了问题!
    【解决方案2】:

    应用建议的解决方法后,我仍然收到错误消息。一旦有符号链接,应用程序验证就不会通过。使用spctl -a -v MyApp.app 命令行来验证捆绑包。

    我深入挖掘,发现 GetJREPath 方法依赖于 libjli.dylib 文件位置。一旦它被移动到 Contents/MacOS/ 文件夹中,一切都被破坏了。我对 GetJREPath 方法做了一点改动,并从源代码重建了 JDK。这是将其应用于您的构建的文件差异:

    diff -r ff67c8965852 src/macosx/bin/java_md_macosx.c
    --- a/src/macosx/bin/java_md_macosx.c   Wed Dec 11 11:19:00 2013 -0800
    +++ b/src/macosx/bin/java_md_macosx.c   Wed Dec 18 17:33:29 2013 +0400
    @@ -640,7 +640,7 @@
             return JNI_FALSE;
         }
    
    -    const char lastPathComponent[] = "/lib/jli/libjli.dylib";
    +    const char lastPathComponent[] = "/Contents/MacOS/libjli.dylib";
         size_t sizeOfLastPathComponent = sizeof(lastPathComponent) - 1;
         if (pathLen < sizeOfLastPathComponent) {
             return JNI_FALSE;
    @@ -648,7 +648,11 @@
    
         size_t indexOfLastPathComponent = pathLen - sizeOfLastPathComponent;
         if (0 == strncmp(realPathToSelf + indexOfLastPathComponent, lastPathComponent, sizeOfLastPathComponent - 1)) {
    -        realPathToSelf[indexOfLastPathComponent + 1] = '\0';
    +        realPathToSelf[indexOfLastPathComponent + 10] = 'H';
    +        realPathToSelf[indexOfLastPathComponent + 11] = 'o';
    +        realPathToSelf[indexOfLastPathComponent + 12] = 'm';
    +        realPathToSelf[indexOfLastPathComponent + 13] = 'e';
    +        realPathToSelf[indexOfLastPathComponent + 14] = '\0';
             return JNI_TRUE;
         }
    

    以下是 OpenJDK7 的构建和打包说明:https://github.com/hgomez/obuildfactory/wiki/Building-and-Packaging-OpenJDK7-for-OSX

    我也向 Oracle 提交了一个错误。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多