首页 文章

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

提问于
浏览
5

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

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

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

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

我错过了什么吗?

4 回答

  • 2

    经过多次尝试后想出了问题 .

    在我的情况下:Pop消息 - 损坏的应用程序是由于库缺失 . 我使用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>
    

    一旦完成这些操作,您将看不到弹出消息,说应用已损坏或损坏或未识别的开发人员 .

  • 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名称中的空格不太可能 . 如果这样做,请不要忘记在命令行中转义它们,或者将文件路径包装在引号中 .

  • 1

    我发现了这个问题 .

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

    这打破了签名并导致Mac吓坏了并声明应用程序已损坏 .

    花了一段时间才发现这一点 .

  • 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作为 python -B 运行,指示它不要创建 .pyc 文件 .

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

相关问题