为OS X应用程序包签名代码

时间:2014-02-12 18:21:28

标签: macos mono signing osx-gatekeeper

我正在使用Mono Framework将.NET应用程序移植到OS X.该应用程序工作正常,除了包装我们已经完成了所有工作。我在捆绑包中打包一个独立的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

有任何进一步的见解吗?

2 个答案:

答案 0 :(得分:0)

我不确定--deep是否应该起作用,但它并不是我们在Xamarin.Mac项目的代码签名时在Xamarin Studio中使用的。我们所做的是单独对每个本地库进行编码,然后对应用程序包本身进行编码。

希望有所帮助。

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

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

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

答案 1 :(得分:-1)

之后我开始工作了。诀窍是保留MacOS目录中唯一的可执行文件,并在Resources目录中包含其他所有内容。这样我们就不需要签署所有其他的东西。

另一个错误 - 不是这个问题的根源,而是另一个错误 - 是我们试图用错误的证书签名。 “第三方Mac开发者应用程序”显然用于App Store提交。这个名字有点误导,所以很容易搞砸了。更多信息:Difference between “Mac Developer” and “3rd Party Mac Developer Application”