【问题标题】:Code signed Mac app broken after downloading下载后代码签名的 Mac 应用程序损坏
【发布时间】:2014-03-13 02:17:25
【问题描述】:

我正在尝试使用命令行对 Mac 应用程序进行签名,我有一个脚本在 Mountain Lion 中运行良好,但在 Mavericks 中似乎不再运行。

一切似乎都运行良好,并且在签名后运行以下命令会产生预期的输出:

> spctl -a -vvvv Name.app
Name.app: accepted
source=Developer ID
origin=Developer ID Application: Name, Inc (HA44SZ69G3)

然后我压缩 .app,上传到 Amazon S3,下载并解压缩并运行相同的命令 - 输出为:

spctl -a -vvvv Name.app
Name.app: rejected
source=no usable signature

【问题讨论】:

标签: macos code-signing


【解决方案1】:

您是否正在使用 OS X 的命令行工具创建和/或扩展 zip 存档?它们没有正确保存和恢复 OS X 的复杂文件系统元数据,因此恢复的应用程序将与您签署的应用程序不同。如果您需要在命令行创建保存元数据的 zip 存档,请使用:

ditto -c -k --sequesterRsrc --keepParent src_directory archive.zip

(请参阅this previous question)。要展开它并重新附加元数据,请使用:

ditto -x -k archive.zip dst_directory

【讨论】:

  • 这太可笑了;所以文件本质上不是原始文件?它是否也会使 md5 校验和失败,并且这只发生在 .zip 压缩文件中吗?感谢您分享此信息 - 确实很有趣。
  • @l'L'l md5 单个文件的校验和将匹配,因为它仅取决于文件的内容,而不是其元数据。但是,如果您在 Finder 中或使用 ditto 创建了一个 zip,然后使用 unzip 将其展开,您会发现存档中还有其他文件 -- AppleDouble 文件用于保存非标准元数据zip 格式不本地存储。 Finder 和ditto 都理解 AppleDouble,并将元数据重新附加到正常文件; unzip 不会并将 AppleDouble 扩展为单独的文件。
  • 我明白,虽然压缩和解压缩代码签名的应用程序不应该影响 .app 本身的内容,但实际上会使代码签名无效吗?
  • @l'L'l .app 的“内容”相当复杂。 OS X 应用程序实际上是一个文件夹,文件夹其中的每个子文件夹和文件都可以附加复杂的元数据。 zip 格式仅支持基本元数据,因此除非使用某种解决方法(如 AppleDouble 编码),否则 zip 格式无法完全保留 .app(或任何其他 OS X 文件或文件夹)。
  • 哦,是的,我对应用程序包的结构非常熟悉;只是对元数据方面有点惊讶。除了您的回答之外,我认为以只读格式创建诸如 .dmg.iso 之类的存档将是保存元数据的另一种方法,但如果我错了,请纠正我。
【解决方案2】:

聚会有点晚了,无论如何我的解决方案是使用tar而不是zip,如下所示:

tar -czf ../my-app.tar.gz my-app.app

压缩和解压缩文件后保留签名和公证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2017-03-01
    相关资源
    最近更新 更多