Apple 的协同设计实用程序如何决定使用哪种 SHA 算法对共享库进行签名?

2023-12-29

首先,有一点背景知识:我正在调查为什么我公司的 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"

经过大量谷歌搜索后,这个答案 https://stackoverflow.com/a/40980658/131930 and 这个答案 https://stackoverflow.com/a/17148833/131930引导我找到解决方案。

问题是我的应用程序中包含的几个第三方共享库仅使用其默认构建设置(例如“./configure; make”)进行编译,并且由于它们是在 OS/X 10.12 下编译的,因此它们自然编译时仅考虑 10.12 兼容性。

为了让它们以这样的方式进行编译,使得生成的 .dylib 文件也适用于早期的 OS/X 版本,我将这些行添加到构建脚本的顶部:

export  LDFLAGS="-mmacosx-version-min=10.9"   
export   CFLAGS="-mmacosx-version-min=10.9"   
export CXXFLAGS="-mmacosx-version-min=10.9"

...这对除 libssl 之外的所有库(libssh2、libsndfile、libogg、libflac、libvorbis 等)都有效——对于那个库,我必须手动修改配置文件并插入 -mmacosx- version-min 参数以这种方式转换为编译器的命令行参数。

经过这一更改,codesign 现在将 SHA-1 和 SHA-256 哈希值应用于所有 .dylib 文件,并且生成的 .app 现在可以在 10.10.x 下按预期运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apple 的协同设计实用程序如何决定使用哪种 SHA 算法对共享库进行签名? 的相关文章

随机推荐