Mac DMG奇怪 - 签名和“损坏”的应用程序

时间:2014-03-17 15:11:51

标签: macos dmg osx-gatekeeper

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

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

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

我不知道发生了什么。如何在本地正确运行相同的文件,但上传和下载时它是否已损坏?服务器很好,我们公司的其他各方上传和下载应用程序就好了。

我错过了什么吗?

6 个答案:

答案 0 :(得分:2)

我很高兴你找到了你的问题。如果其他人发现此帖子搜索损坏的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名称中的空格不太可能。如果您这样做,请不要忘记在命令行中转义它们,或者将文件路径用引号括起来。

答案 1 :(得分:1)

我发现了这个问题。

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

这会破坏签名并导致Mac出现异常并声明应用程序已损坏。

花了一段时间才发现。

答案 2 :(得分:1)

经过多次尝试后想出问题。

在我的情况下: 流行消息 - 损坏的应用程序是由于库丢失。 我使用QT创建了.app文件。 要生成dmg,我使用的是deploymacqt命令工具。 deploymacqt工具在.app中创建动态库,所以基本上如果我们在创建dmg之前进行协同编码,这个alter会操纵代码符号。 所以正确的解决方法是。

# 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>

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

答案 3 :(得分:0)

我的问题与@JasonGenX's post中描述的问题有相似但不同的原因。

我的应用程序运行时有些文件被修改,导致该应用程序的签名无法通过验证。

要修复此问题,我删除了这些文件,并阻止了它们的创建或修改,以使.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报告该应用程序捆绑已损坏。


解决方法是从捆绑的Python资源中删除.pyc个文件,并以python -B身份运行Python,指示它不要创建.pyc个文件。

我重建了没有.pyc文件的.app捆绑包,而Python不再创建它们,因此.app捆绑包保持不变。

答案 4 :(得分:0)

打开终端并运行:

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

和“ /Applications/xxx.app”必须是您的应用程序的路径。例如,我要运行PDF Expert,其路径为“ / Applications / PDF \ Expert.app”。然后我应该在我的终端上按Enter键。

sudo xattr -rd com.apple.quarantine /Applications/PDF\ Expert.app"

答案 5 :(得分:0)

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

enter image description here

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