如何在签署应用程序时保留别名属性?

时间:2013-11-25 10:45:57

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

我在Mavericks的JavaFX应用程序应用程序上创建并使用 -

使用Xcode 5.0.2进行签名
codesign --deep -s "my name" MayApp.app
codesign -v MayApp.app && echo MayApp.app is Signed Successfully!

没有签署MYAPP发布精彩!!

不使用 - 深,我无法在小牛队签署应用。

- 更多尝试 -

现在在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属性存在于 - MyApp.app/Contents/PlugIns/jdk1.7.0_21.jdk/Contents/MacOS的.dylib 。签署将 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手动复制该别名,也会发生同样的情况。

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

由于

2 个答案:

答案 0 :(得分:4)

我的问题通过将Java从jdk7u21更新到最新的jdk7u45得到解决,因为Apple在OS X上已禁用Oracle的Java版本7u25及更低版本。更新到最新版本将允许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 libjli.dylib 别名的.jdk / Contents / MacOS
  3. 我们还需要将 /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Info.plist 从系统安装的jdk复制到我们的 MyApp.app/Contents/PlugIns /jdk1.7.0_45.jdk/Contents /
  4. 注意:步骤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:捆绑包格式无法识别,无效或不合适 - 我们正面临这个问题,因此我们需要确定哪些内容会使应用包格式无法识别,无效,或者不适合。

    由于

答案 1 :(得分:0)

应用建议的解决方法后仍然出现错误。一旦有符号链接,就无法通过应用验证。使用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填了一个bug。希望这会有所帮助。