6

我的 Gatekeeper 设置是“App Store 和 Identified Developers”

我有一个带有签名应用程序的 DMG。

当我安装 DMG 并在本地运行它时,它可以工作。当我将相同的 DMG 上传到我们的服务器(通过 http)、下载(通过 http)、挂载并尝试运行应用程序时,我收到一个弹出窗口,说我的应用程序“已损坏,无法打开。你应该移动它到垃圾箱。

我不知道是怎么回事。同一个文件如何在本地正确运行,但上传和下载时却损坏了?服务器很好,我们公司的其他方从它上传和下载应用程序也很好。

我错过了什么吗?

4

6 回答 6

3

我很高兴你发现了你的问题。如果其他人发现这篇文章搜索损坏的 DMG,我想添加另一个可能的解决方案:

除了签署 .app 捆绑包:

codesign -f -s "Developer ID Application: Your Dev ID Here" -v "Your App.app"

您还应该签署创建的 DMG:

codesign -f -s "Developer ID Application: Your Dev ID Here" -v YourProgram.dmg

我没有在 dmg 文件路径周围加上引号,因为 dmg 名称中不太可能有空格。如果这样做,请不要忘记在命令行上转义它们,或者将文件路径用引号括起来。

于 2014-07-21T23:34:37.473 回答
1

我发现了问题。

我不知道,我们的安装程序在安装时将一个文件写入应用程序包。

这会破坏签名并导致 Mac 崩溃并宣布应用程序损坏。

花了一段时间才发现。

于 2014-03-20T15:32:05.337 回答
1

多次尝试后发现问题所在。

就我而言:弹出消息 - 由于缺少库而损坏的应用程序。我使用 QT 创建了 .app 文件。为了生成 dmg,我使用了 deploymacqt 命令工具。deploymacqt 工具在 .app 中创建动态库,所以基本上如果我们在创建 dmg 之前进行代码签名,这个修改将操纵代码签名。所以正确的解决方法是。

# Create dmg using 
    deploymacqt <yourapp.app> -dmg

# Open resulted dmg file, copy <yourapp.app> to different folder(let's say /Documents/<yourapp.app>)

# Codesign the /Documents/<yourapp.app> using 
    codesign --deep --force --verify --verbose --sign "Developer ID Application: <developerid>" <yourapp.app>

# Verify using
    codesign --verify --verbose=4 <yourapp.app>
 * you should see something like this
    <yourapp.app>: valid on disk
    <yourapp.app>: satisfies its Designated Requirement

# Now create again the dmg file using [dropdmg](https://c-command.com/dropdmg/) application, download, install dropdmg. set the cofiguration preferences with your developer id certificate in signing option.

# drag and drop <yourapp.app> to dropdmg app, wait for creation of dmg to complete. voila you have now successfully created dmg with proper developer id certification.

# verify resulted dmg again using   
     codesign --verify --verbose=4 <yourapp.dmg>
# you can also verify with gatekeeper
     spctl -a -t exec -vv <yourapp.dmg>

完成这些操作后,您将不会看到弹出消息说应用程序已损坏或损坏或身份不明的开发人员。

于 2017-06-30T13:06:34.370 回答
1

打开终端并运行:

sudo xattr -rd com.apple.quarantine /Applications/xxx.app

并且“/Applications/xxx.app”必须是您的应用程序的路径。例如,我不想运行 PDF Expert,它的路径是“/Applications/PDF\ Expert.app”。然后我应该在我的终端上输入这个并输入:

sudo xattr -rd com.apple.quarantine /Applications/PDF\ Expert.app"
于 2019-11-05T11:12:26.653 回答
0

我的问题与@JasonGenX 的帖子中描述的问题有相似但不同的原因。

我的应用程序有一些文件在我运行时被修改,这导致应用程序的签名验证失败。

为了修复它,我删除了这些文件并阻止它们被创建或修改,因此 .app 包永远不会自行更改。


具体来说,我的应用程序包中有 Python 代码。当应用程序运行 Python 时,它会将导入编译为.pyc文件。这些与应用程序包的其余部分一起签署。

当我在创建 DMG 之前运行 .app 时,Python 更新并修改了这些.pyc文件,因此它们不再通过签名验证。我使用以下方法验证了这一点:

$ codesign --verify --verbose=4 my.app
[...]
my.app: a sealed resource is missing or invalid
file modified: /private/tmp/my.app/Contents/Resources/python-dist/chardet/codingstatemachine.pyc
file modified: /private/tmp/my.app/Contents/Resources/python-dist/chardet/euckrprober.pyc
[...etc...]

.app 仍然在我自己的计算机上运行,​​因为我自己构建了它,所以它是受信任的。但是当我上传和下载 DMG 时,它被标记为表明它来自不受信任的来源并需要签名验证。

由于签名验证失败,MacOS 报告 app bundle 已损坏。


解决方法是.pyc从我捆绑的 Python 资源中删除文件,然后将 Python 作为 运行python -B,这指示它不要创建.pyc文件。

我在没有文件的情况下重建了我的 .app 包.pyc,Python 不再创建它们,所以 .app 包保持不变。

于 2018-07-04T16:33:04.753 回答
0

Ι 与我创建并签名的 macOS 应用程序有同样的问题。我的项目中有一些有问题的 png,无法在存档中传输。当我尝试通过 App Connect 验证应用程序时,出现以下消息。

在此处输入图像描述

我删除了有问题的 png,我再次归档了应用程序,对其进行了公证,使用 Developer-id 将其导出,上传到我的服务器,从我的服务器下载并成功运行它。

于 2021-03-07T13:18:17.503 回答