【问题标题】:Signing code for OS X application bundleOS X 应用程序包的签名代码
【发布时间】:2014-02-12 18:21:28
【问题描述】:

我正在使用 Mono 框架将 .NET 应用程序移植到 OS X。该应用程序运行良好,我们已经完成了除了打包之外的所有工作。我在捆绑包中打包了一个独立的 Mono 构建以避免依赖关系,并使用这个工具来完成这项工作:https://github.com/OutOfOrder/MonoKickstart

我们使用的bundle结构是这样的:

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

任何进一步的见解?

【问题讨论】:

    标签: macos mono signing osx-gatekeeper


    【解决方案1】:

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

    希望对您有所帮助。

    更新:这可能是问题:

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

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

    【讨论】:

    • 将尝试分别签署每个本机库,看看是否可行。我的猜测是您不需要对 exe 和 dll 进行签名,因为从 OS X 的角度来看,它们本质上只是用于单声道处理的数据文件,对吧?顺便提一句。 MonoKickstart 不生成应用程序包,而只是生成 unix 风格的可执行二进制文件。我们手工制作了包装。
    • 对,您不需要对 .exe 或 .dll 文件进行签名。
    • 好的,尝试单独签署文件,但没有多大成功...检查主帖中的更新。
    【解决方案2】:

    后来我得到了这个工作。诀窍是在 MacOS 目录中只保留一个也是唯一的可执行文件,而在 Resources 目录中保留其他所有文件。这样我们就不需要签署所有其他的东西了。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2014-06-16
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多