当前位置:  开发笔记 > 运维 > 正文

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

如何解决《Apple的codeign实用程序如何决定使用哪种SHA算法对共享库进行签名?》经验,为你挑选了1个好方法。

首先,一点背景:我正在调查为什么我公司的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中的库 - 都是使用完全相同的codesign命令签名的,通过运行OS/X 10.12的OS/X构建机器上的build/package脚本 - - 为它们计算不同类型的哈希值.

也就是说,如果我查看其中一个非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库结束的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"

Jeremy Fries.. 14

经过大量的谷歌搜索,这个答案和这个答案让我得到了解决方案.

问题是我的应用程序中包含的几个第三方共享库只使用它们的默认构建设置(例如"./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下运行.



1> Jeremy Fries..:

经过大量的谷歌搜索,这个答案和这个答案让我得到了解决方案.

问题是我的应用程序中包含的几个第三方共享库只使用它们的默认构建设置(例如"./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下运行.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有