Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xcode外部对Mac应用程序进行数字签名失败_Xcode_Macos_Cocoa_Code Signing_Osx Gatekeeper - Fatal编程技术网

在Xcode外部对Mac应用程序进行数字签名失败

在Xcode外部对Mac应用程序进行数字签名失败,xcode,macos,cocoa,code-signing,osx-gatekeeper,Xcode,Macos,Cocoa,Code Signing,Osx Gatekeeper,我用Qt5开发了一个Mac应用程序,所以在Xcode之外。我希望GateKeeper允许我的应用程序在客户端的计算机上运行,而不是发出“无法打开,因为无法确认开发人员的身份”警告 我已经成功地对应用程序进行了数字签名,但GateKeeper仍然对此表示不满。我有一份苹果开发者证书(我是团队代理),我的钥匙链上说它是有效的。我还安装了两个Apple根证书 我使用命令行实用程序codesign对应用程序文件夹中的所有二进制文件进行数字签名,此外,我还对应用程序文件夹本身进行数字签名。在所有情况下,协

我用Qt5开发了一个Mac应用程序,所以在Xcode之外。我希望GateKeeper允许我的应用程序在客户端的计算机上运行,而不是发出“无法打开,因为无法确认开发人员的身份”警告

我已经成功地对应用程序进行了数字签名,但GateKeeper仍然对此表示不满。我有一份苹果开发者证书(我是团队代理),我的钥匙链上说它是有效的。我还安装了两个Apple根证书

我使用命令行实用程序
codesign
对应用程序文件夹中的所有二进制文件进行数字签名,此外,我还对应用程序文件夹本身进行数字签名。在所有情况下,协同设计的响应都是信息性的,不会显示错误。使用codesign,我可以检查所有二进制文件是否都已签名,运行

$ codesign --verify --deep --verbose=2 MyApp.app
显示所有二进制文件都已验证。此外,它还报告:

MyApp.app:在磁盘上有效
MyApp.app:满足其指定要求

运行:

$ codesign -v --verbose=4 --display MyApp.app   
给予

可执行文件=/Users/xxx/trunk/yyy/deploy/release/MyApp.app/Contents/MacOS/MyApp
标识符=aaaa.MyApp
格式=采用Mach-O薄型(x86_64)的线束
CodeDirectory v=20200 size=12461 flags=0x0(无)散列=616+3位置=嵌入
散列类型=sha1大小=20
CDHash=d1c12c783dac0e8d9a2b749fb896b11558cec8b6
签名大小=8532
Authority=开发者ID应用程序:XXXXX
Authority=开发人员ID证书颁发机构
权限=苹果根CA
时间戳=2015年7月29日12;04:40
Info.plist条目=8
TeamIdentifier=YYYYY
密封资源版本=2个规则=12个文件=10
内部需求数量=1尺寸=180

看起来还可以

运行

$ spctl -a -t exec -vv MyApp.app
在所有二进制文件上,给出结果

MyApp.app:已接受
source=开发者ID
来源=开发者ID应用程序:XXXX

这看起来也不错

运行XCode命令行工具检查签名 在应用程序上或应用程序文件夹中的二进制文件上:

$ ./check-signature /Users/xxx/trunk/yyy/release/MyApp.app
结果

(c) 2014苹果公司版权所有

这在所有情况下都是理想的结果

但GateKeeper仍然不接受该应用程序,并抱怨无法确认开发人员

[作者于2015年7月17日星期五添加]

我想我已经发现了问题所在。我不知道这是一个功能还是一个OSX错误。stackoverflow对我帮助很大

无论何时从internet下载文件,它都会获得与之关联的扩展文件属性com.apple.quantial。在Finder中双击此下载文件时,GateKeeper有两种可能:

  • 文件未签名时,会发出“未识别的开发人员等”消息

  • 当对文件进行数字签名时,会发出“无法确认开发人员等”消息

  • 在这两种情况下,MessageBox只有一个按钮,即OK按钮。单击此按钮时,除了MessageBox关闭之外,什么也没有发生

    如果扩展属性被删除(xattr-d),应用程序将运行,无论是否签名

    当应用程序通过在应用程序的Finder中单击鼠标右键,然后单击“打开”菜单操作启动时,行为会有所不同。两个消息框中的一个也会显示出来,但现在有一个额外的按钮,允许用户无论如何打开应用程序。同样,已签名和未签名之间的唯一区别是“未确认”或“未确认”消息。我不希望我的客户能够分辨出不同之处。因此,在应用程序上签名是徒劳的

    基于这个原因,我希望在双击下载的应用程序时,守门员会有另一种更好的行为(可能文档已经过时,或者我误读了):

  • 如果应用程序已签名,则网守应显示一个带有“从internet下载”的消息框和一个带有“继续”的按钮

  • 如果应用程序未签名,则会显示一个消息框,其中包含一个确定按钮和一条文本“未识别的开发人员等…”


  • 很抱歉回答我自己的问题,但我认为没有其他方法,因为编辑原始问题会导致出现意大利面文本

    我终于解决了我的问题。首先是功劳:(i)对我的另一个stackoverflow的回答非常有用,(ii)我从一个苹果官方开发者那里得到了非常好的(付费)建议,提交了一个所谓的技术支持事件(TSI)

    在此基础上,我现在可以在这里给出一个非常简明的配方,说明如何让你的Mac应用程序成功地被GateKeeper处理。在详细说明配方后,我将说明我最初的错误是什么

    目标:在Xcode之外开发了一个Mac应用程序,让网守发出警告“从互联网下载…”,其中有三个按钮,其中一个是“打开”。

    失败:当网守发出带有文本“.Unsignified developer..”或文本“.Unsignified developer..”的警告时,在这两种情况下,都是带有单个OK按钮的消息框。

    准备好应用程序网关守卫需要三个步骤:

    • 使你的应用程序独立,没有不可接受的外部依赖关系。唯一可接受的外部依赖项是系统库。所有其他依赖项都应复制到MyApp.app文件夹中。GateKeeper拒绝任何具有非系统外部依赖关系的应用程序
    • 二进制文件不应位于MyApp.app文件夹内的非法位置。库进入MyApp/Contents/Frameworks,可执行文件进入MyApp/Contents/MacOS
    • MyApp中的所有二进制文件都应该进行数字签名。然后应该对MyApp.app文件夹进行签名。对于此签名,需要一个Apple“开发者ID应用程序…”证书
    我们的食谱是自动的。所有的工作都是由一个脚本完成的。如果出现Qt-Cre
    # 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>
    
    APP_PATH="Any.app"
    xattr -w com.apple.quarantine '0081;5a37dc6a;Google Chrome;F15F7E1C-F894-4B7D-91B4-E110D11C4858' "$APP_PATH"
    xattr -l "$APP_PATH" # You should see the quarantine attribute here
    open "$APP_PATH"