OS X应用程序捆绑包的签名代码



我正在使用Mono Framework将.NET应用程序移植到OSX。该应用程序运行良好,除了包装之外,我们已经完成了所有工作。我在捆绑包中打包了一个独立的Mono构建,以避免依赖性,并使用此工具完成任务:https://github.com/OutOfOrder/MonoKickstart

我们使用的束结构如下:

OurApp.app
-Contents
+-Info.plist
+-MacOS
|   +-osx   - native libraries for osx
|   +-mono  - mono config files
|    ...  - the OS X kickstart binaries, the .exe file, C# .dlls
-Resources/
-icon.icns

当OS X的Gatekeeper功能启动时,捆绑包运行良好,但当试图对其进行签名以使其始终运行时,我遇到了问题。。。

$ codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --deep --verbose OurApp.app
OurApp.app: bundle format unrecognized, invalid, or unsuitable
In subcomponent: OurApp.app/Contents/MacOS/mono/4.0

好吧,我会暂时删除mono目录,看看它是否会继续:

$ codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --deep --verbose OurApp.app
OurApp.app: signed bundle with Mach-O universal (i386) [org.ourcompany.ourapp]

成功!我是这么认为的,但当我尝试运行该应用程序时,它仍然说它仍然被Gatekeeper屏蔽。当我运行时

spctl -a -v OurApp.app
OurApp.app/: rejected

那是什么呢?它说它签署了捆绑包,如果我理解正确的话,使用--deep参数,它应该已经签署了所有的库等等。我该怎么做才能让它发挥作用?

更新:

尝试使用此逐一对文件进行签名。

codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --verbose OurAppExecutable.bin

但它拒绝这样做,因为"子组件"(即使我没有使用--deep)。

我最终通过将除实际二进制文件外的所有其他文件移动到Resources文件夹,然后对二进制文件进行签名,然后对应用程序捆绑包进行签名。

但是,它说:

spctl -a -v OurApp.app
OurApp.app/: rejected
source=No Matching Rule

有什么进一步的见解吗?

我不确定--deep是否应该工作,但它不是我们在Xamarin.Mac项目代码签名时在Xamarin Studio中使用的。我们所做的是分别对每个原生库进行代码签名,然后对应用程序捆绑包本身进行代码签名。

希望能有所帮助。

更新:这可能是问题所在:

OurApp.app: bundle format unrecognized, invalid, or unsuitable
In subcomponent: OurApp.app/Contents/MacOS/mono/4.0

问题可能是MonoKickStart没有生成正确的Mac可执行文件?

之后我就开始工作了。诀窍是在MacOS目录中只保留一个也是唯一的可执行文件,并在Resources目录中保留其他所有文件。这样我们就不需要对所有其他文件进行签名。

另一个错误——不是这个问题的根源,而是另一个问题的根源——是我们试图用错误的证书签名。"第三方Mac开发者应用程序"显然用于应用商店提交。这个名字有点误导人,所以很容易搞砸。更多信息:"Mac开发者"one_answers"第三方Mac开发者应用程序"之间的区别

相关内容

  • 没有找到相关文章

最新更新