我正在签署包含具有有效开发人员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.CodeDirectory
、com.apple.cs.CodeRequirements
和com.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.quarantine
和com.apple.metadata:kMDItemWhereFroms
),因此将不被视为已签名。另一方面,其中包含的文件仍然应该被正确签名(因为它们的签名是图像文件内容的一部分)。
从OS X v10.11.5开始,codesign
支持将签名嵌入到磁盘映像本身中,这样它就可以通过HTTP下载。从v10.12开始,gatekeeper将对未签名磁盘映像中的应用程序实施额外的限制,这将阻止应用程序从磁盘映像加载其他内容(主要是动态库),除非它们包含在应用程序本身中。如果您不知道这是否与您的应用程序相关,请继续对磁盘映像进行签名(实际上,无论如何,这是一个好主意),但请确保在10.11.5或更高版本下运行codesign
,否则签名将无法以有用的格式运行!