【问题标题】:OS X App Codesign issueOS X 应用程序代码设计问题
【发布时间】:2017-07-25 11:32:34
【问题描述】:

我有一个 OS X 应用程序,它使用 XCode 之外的自定义构建流程。因此,我必须在命令行模式下使用 codesign 工具对应用程序中的所有内容进行签名。我使用的命令行是:

codesign -f -s "开发者 ID 应用程序:MyCompany Inc" -i com.mycompany.myapp -v $Path_To_App

我首先通过将每个二进制文件、框架和插件的路径传递为 $Path_To_App 来签署应用程序中的每个二进制文件、框架和插件。然后我通过传递应用程序文件夹 MyApp.app 的路径对整个应用程序进行了签名。

之后,我使用以下命令构建了一个 dmg 文件:

hdiutil create -format UDBZ -srcfolder path_to_app_folder myapp.dmg

如果我在本地安装这个 dmg 文件,一切都很好。我相信 OS X 在这种情况下甚至不会检查证书。但是在我将 dmg 文件上传到 Web 服务器后,使用浏览器下载它并将应用程序解压缩到 Applications 文件夹后,操作系统会拒绝该应用程序已损坏。消息是:

“MyApp”已损坏,无法打开。你应该把它移到回收站。

如果我像这样检查签名,那很好:

codesign --verify --verbose /Applications/MyApp.app

/Applications/MyApp.app:在磁盘上有效 /Applications/MyApp.app:满足其指定要求

但是,如果我用 spctl 检查它,它确实会抱怨:

spctl -a -v /Applications/MyApp.app /Applications/MyApp.app:密封资源丢失或无效

我不确定我在哪里做错了。这是网络上已签名的 dmg 文件的 url:http://www.slimjet.com/test/slimjet1.dmg

非常感谢您的帮助!

这是一个更新。只有当我将应用程序解压缩到 /Applications 文件夹并从那里运行它时,才会显示损坏警告。如果我将它放入任何其他文件夹并运行,或者直接从安装的 dmg 存档中运行它,它就可以正常运行。

【问题讨论】:

    标签: macos codesign


    【解决方案1】:

    事实证明,网守保留了有关先前故障的缓存信息。即使您稍后通过应用所有正确的签名来解决问题,spctl 命令仍然会报告相同的错误而无需再次实际检查。 codesign 命令不使用缓存,但 spctl 使用。我必须通过以下命令重置系统策略数据库:

    sudo cp /var/db/.SystemPolicy-default /var/db/SystemPolicy

    之后,我重新启动操作系统。然后我的应用程序运行得很好。虽然 spctl 有一个“--ignore-cache”开关,但在这种情况下它没有任何作用。

    【讨论】:

      【解决方案2】:

      你也忘了协同设计:

      FlashPeak Slimjet.app/Contents/Versions/13.0.6.0/FlashPeak Slimjet Helper.app
      FlashPeak Slimjet.app/Contents/Versions/13.0.6.0/FlashPeak Slimjet Framework.framework/Resources/app_mode_loader.app
      

      由于他们没有进行代码签名,这可能是问题所在;可能还有其他,但请先检查这些。

      【讨论】:

      • 感谢您的 cmets。我已经签署了这两个应用程序并仔细检查了整个应用程序文件夹。但是当我下载新的 dmg 文件(仍然在 url)时,我仍然遇到同样的错误。
      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多