【问题标题】:Mac DMG oddity - signing and "damaged" applicationsMac DMG 奇怪 - 签名和“损坏”的应用程序
【发布时间】:2014-03-17 15:11:51
【问题描述】:

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

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

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

我不知道发生了什么。同一个文件如何在本地正确运行,但上传和下载时却损坏了?服务器没问题,我们公司其他人上传和下载应用程序也没问题。

我错过了什么吗?

【问题讨论】:

  • 您确认它确实是同一个文件并且没有损坏或损坏吗?

标签: macos dmg osx-gatekeeper


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    经过多次尝试后发现了问题。

    就我而言: 弹出消息 - 由于缺少库而导致应用程序损坏。 我使用 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>
    

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

    【讨论】:

      【解决方案3】:

      我发现了问题。

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

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

      花了一段时间才发现。

      【讨论】:

      • 为什么将 DMG 上传到您的服务器会改变这一点?在这两种情况下不会写入同一个文件吗? (仅供参考 - 我们看到了同样的问题,但尚不清楚原因是什么)
      • 您能解释一下您是如何解决这个问题的吗? (你在你的应用中做了什么改变?)
      • @ChrisR,我认为 OS X 对从 Internet 下载的文件采取了更严格的安全措施。
      • @JasonGenX 那你是怎么解决的,有人有解决方案吗?
      【解决方案4】:

      打开终端并运行:

      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"
      

      【讨论】:

        【解决方案5】:

        我的问题与@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 报告 app bundle 已损坏。


        修复方法是从我捆绑的 Python 资源中删除 .pyc 文件,并以 python -B 运行 Python,这指示它不要创建 .pyc 文件。

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-20
            • 1970-01-01
            • 2011-01-31
            • 2016-12-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多