OS X .dmg签名下载后丢失



我正在签署包含具有有效开发人员ID配置文件的.app.dmg。所有内容都已签名,包括框架。当我运行codesign -dvvv时,出现了正确的证书,satisfies its Designated Requirement。应用程序运行良好。

然而,当我上传和下载.dmg时,签名"消失"了。当我运行codesign -dvvv时,它显示的是code object is not signed at all。GateKeeper自然会拒绝运行应用程序。

注意:这听起来很像这个问题,但我肯定是用正确的开发者ID证书签署的,.dmg不会出现"损坏"。

[注:这种情况在OS X v10.11.5和v10.12中发生了显著变化;[参考译文]

一般来说,真正需要签名的是磁盘映像中的文件(主要是应用程序),而不是映像本身。下载图像后,将在使用单个项目时检查其签名。从OS X 10.11.5开始,签名磁盘映像得到了适当的支持,有时是必需的,但这是在对其中的相关项进行签名之外的。

通过OS X v10.11.4,您可以对磁盘映像本身进行签名(使用codesign -s "Developer ID Application: [your company]" example.dmg),但是这样创建的签名以附加到映像文件的扩展属性的形式存储。实际上,它创建了三个xattrs,分别命名为com.apple.cs.CodeDirectorycom.apple.cs.CodeRequirementscom.apple.cs.CodeSignature。关键是要认识到这些属性是文件系统元数据——也就是说,它们附加到文件上,而不是文件内容的一部分。HTTP协议对文件系统元数据的支持非常有限,因此当您通过HTTP(或FTP或…)上传或下载时,它只传输文件的内容,而xattrs会丢失。

您可以使用ls -l@命令查看xattrs(甚至可以使用xattr命令查看更详细的内容):

$ ls -l@ example.dmg
-rw-r--r--@ 1 gordon  staff  338590 Nov 13  2013 example.dmg
        com.apple.cs.CodeDirectory         120 
        com.apple.cs.CodeRequirements      172 
        com.apple.cs.CodeSignature        8515 
        com.apple.diskimages.fsck           20 
        com.apple.diskimages.recentcksum         81

下载后,映像将失去这些属性(并且可能从下载过程中获得com.apple.quarantinecom.apple.metadata:kMDItemWhereFroms),因此将不被视为已签名。另一方面,其中包含的文件仍然应该被正确签名(因为它们的签名是图像文件内容的一部分)。

从OS X v10.11.5开始,codesign支持将签名嵌入到磁盘映像本身中,这样它就可以通过HTTP下载。从v10.12开始,gatekeeper将对未签名磁盘映像中的应用程序实施额外的限制,这将阻止应用程序从磁盘映像加载其他内容(主要是动态库),除非它们包含在应用程序本身中。如果您不知道这是否与您的应用程序相关,请继续对磁盘映像进行签名(实际上,无论如何,这是一个好主意),但请确保在10.11.5或更高版本下运行codesign,否则签名将无法以有用的格式运行!

相关内容

  • 没有找到相关文章

最新更新