在Xcode外部对Mac应用程序进行数字签名失败
我用Qt5开发了一个Mac应用程序,所以在Xcode之外。我希望GateKeeper允许我的应用程序在客户端的计算机上运行,而不是发出“无法打开,因为无法确认开发人员的身份”警告 我已经成功地对应用程序进行了数字签名,但GateKeeper仍然对此表示不满。我有一份苹果开发者证书(我是团队代理),我的钥匙链上说它是有效的。我还安装了两个Apple根证书 我使用命令行实用程序在Xcode外部对Mac应用程序进行数字签名失败,xcode,macos,cocoa,code-signing,osx-gatekeeper,Xcode,Macos,Cocoa,Code Signing,Osx Gatekeeper,我用Qt5开发了一个Mac应用程序,所以在Xcode之外。我希望GateKeeper允许我的应用程序在客户端的计算机上运行,而不是发出“无法打开,因为无法确认开发人员的身份”警告 我已经成功地对应用程序进行了数字签名,但GateKeeper仍然对此表示不满。我有一份苹果开发者证书(我是团队代理),我的钥匙链上说它是有效的。我还安装了两个Apple根证书 我使用命令行实用程序codesign对应用程序文件夹中的所有二进制文件进行数字签名,此外,我还对应用程序文件夹本身进行数字签名。在所有情况下,协
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有两种可能:
很抱歉回答我自己的问题,但我认为没有其他方法,因为编辑原始问题会导致出现意大利面文本 我终于解决了我的问题。首先是功劳:(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应用程序…”证书
# 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"