首先,有一点背景知识:我正在调查为什么我公司的 MacOS/X 应用程序(从所有方面来看,该应用程序似乎都已正确签名;它在 MacOS/X 10.11.x 和 10.12.x 下运行良好;Gatekeeper 在所有方面都很好) MacOS 版本;“spctl --assess”和“codesign -vvvv”都表示它满足所有操作系统版本的要求)但是不会在 OS/X 10.10.x 下启动 - 当我尝试启动时在 10.10.x 下它,我收到一份崩溃报告,其中 dyld 抱怨某些库未正确签名:
Dyld Error Message:
Library not loaded: @executable_path/../Frameworks/libcrypto.1.0.0.dylib
Referenced from: /Applications/MyApplication v123/MyApplication.app/Contents/MacOS/MyApplication
Reason: no suitable image found. Did find:
/Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib: code signature invalid for '/Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib'
在调查这个问题时,我注意到 .app/Contents/Framework 中的库——它们都是通过运行 OS/X 10.12 的 OS/X 构建机器上的构建/包脚本使用完全相同的协同设计命令进行签名的—— - 为它们计算不同类型的哈希值。
也就是说,如果我查看其中一个非 Qt .dylib 文件的签名方式,我会发现它只记录了 sha256 哈希值:
sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/libsndfile.1.dylib
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/libsndfile.1.dylib
Identifier=libsndfile.1
Format=Mach-O thin (x86_64)
CodeDirectory v=20200 size=4140 flags=0x0(none) hashes=125+2 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=b4256e9bf0fac567bb8ac86f56964c066b93d069
Hash choices=sha256 <----------------------------- ONLY 256!?
CDHash=b4256e9bf0fac567bb8ac86f56964c066b93d069
Signature size=8846
Authority=Developer ID Application: MyCompany
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jan 24, 2017, 1:39:58 AM
Info.plist=not bound
TeamIdentifier=5XD27G7646
Sealed Resources=none
Internal requirements count=1 size=172
...但是如果我看看任何一个强制 Qt 框架是如何签名的,OTOH,我发现它同时包含 sha1 和 sha256 哈希值:
sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
Identifier=org.qt-project.QtCore
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=42549 flags=0x0(none) hashes=1324+3 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=09b5854f83091228f1baaad1455e7a30d6500c95
CandidateCDHash sha256=6dfdc74da06618e1b406a6e5fd0794fe43701def
Hash choices=sha1,sha256 <------------- BOTH sha1 and sha256, yay!
CDHash=6dfdc74da06618e1b406a6e5fd0794fe43701def
Signature size=8896
Authority=Developer ID Application: MyCompany
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jan 24, 2017, 1:39:57 AM
Info.plist entries=8
TeamIdentifier=5XD27G7646
Sealed Resources version=2 rules=13 files=1
Internal requirements count=1 size=184
鉴于尝试在 Yosemite 下运行我的应用程序时 dyld 的错误总是引用只有 sha256 哈希值的库之一,我的工作理论是 OS/X 10.10.x 的 dyld 足够古老,以至于它不知道 SHA- 256 哈希值,这就是为什么当它尝试加载仅使用 SHA-256 哈希值签名的强制共享库时会出错。
我的问题(假设我在这里没有完全指出错误的树)是:codesign 如何决定何时单独使用 sha256 哈希标记文件,而不是同时添加 sha1 和 sha256 哈希?我怎样才能强制协同设计始终包含两个哈希值,以便我的应用程序可以再次在 10.10.x 下启动(就像我们将构建机器升级到 OSX/Sierra 之前一样)?
作为记录,以下是我在构建脚本中调用 codesign 的方式——所有库的调用参数都完全相同(包括以 sha1、sha256 结尾的 Qt 框架库和以 sha1、sha256 结尾的非 Qt 库)仅具有 sha256),例如:
codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/libcrypto.1.0.0.dylib"
codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/QtCore.framework/Versions/5/QtCore"