web-dev-qa-db-ja.com

Appleのcodesignユーティリティは、共有ライブラリに署名するSHAアルゴリズム)をどのように決定しますか?

まず、少し背景があります。私の会社のMacOS/Xアプリケーション(すべてのアカウントで正しく署名されているように見えます。MacOS/ X10.11.xおよび10.12.xで正常に動作します。Gatekeeperはすべてで正常に動作します)を調査しています。 MacOSバージョン;「spctl--assess」および「codesign-vvvv」はすべて、すべてのOSバージョンで要件を満たしていると言っています)それでも、OS/X10.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/X10.12を実行しているOS/Xビルドマシンのビルド/パッケージスクリプトを介して、まったく同じcodesignコマンドを使用してすべて署名されている)に気付きました。 -さまざまな種類のハッシュが計算されます。

つまり、Qt以外の.dylibファイルの1つがどのように署名されたかを見ると、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ハッシュしかないライブラリの1つを参照していることを考えると、私の作業理論では、OS/X 10.10.xのdyldは十分に古く、SHAについて認識していません- 256ハッシュ。これが、SHA-256ハッシュのみで署名されたキャプティブ共有ライブラリを読み込もうとするとエラーになる理由です。

私の質問(ここで間違ったツリーを完全に吠えているわけではないと仮定)は、sha1とsha256ハッシュの両方を追加するのではなく、codesignが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"
13
Jeremy Friesner

何度もグーグルした後、 この答えこの答え が私を解決策に導きました。

問題は、アプリ内に含まれているサードパーティの共有ライブラリのいくつかが、デフォルトのビルド設定( "./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など)のトリックを行いました-そのために私はConfigureファイルを手動で変更して-mmacosx-を挿入する必要がありましたversion-min引数をコンパイラのコマンドライン引数にそのように挿入します。

この変更により、codesignはSHA-1とSHA-256の両方のハッシュをすべての.dylibファイルに適用し、結果の.appは10.10.xで期待どおりに実行されるようになりました。

14
Jeremy Friesner

ジェレミー・フリースナーの答え 1 私のために働いた。 OpenSSLのコンパイルではありません。少なくとも1.0.2時間は、構成ファイルを変更する必要はありませんでした。以下はうまくいきました

./darwin64-x86_64-cc共有を構成します--openssldir = $ HOME/cmake_builds/openssl-1.0.2h.bin -mmacosx-version-min = 10.10

1
user3917005