下载后OS X .dmg签名丢失

时间:2014-05-30 09:22:07

标签: macos download digital-signature osx-gatekeeper

我正在签署一个.dmg,其中包含.app,其中包含有效的开发者ID个人资料。一切都签署,包括框架。当我运行codesign -dvvv时,会显示正确的证书并satisfies its Designated Requirement。应用程序运行正常。

但是,当我上传并下载.dmg时,签名“消失”。当我运行codesign -dvvv时,它会显示code object is not signed at all。并且GateKeeper自然拒绝运行该应用程序。

注意:它听起来很像this issue,但我肯定会使用正确的开发者身份证书签名,.dmg似乎没有“损坏”。

1 个答案:

答案 0 :(得分:7)

[注意: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开始,网守将对未签名磁盘映像中的应用程序强制执行其他限制,这些限制将阻止应用程序从磁盘映像加载其他内容(主要是动态库),除非它们包含在应用程序本身中。如果您不知道这是否与您的应用程序相关,请继续签署磁盘映像(实际上,无论如何都是个好主意),但请确保在10.11.5或更高版本下运行codesign或签名获胜不是有用的格式!