Đầu tiên, một nền tảng nhỏ: Tôi đang điều tra lý do tại sao ứng dụng MacOS/X của công ty tôi (tất cả các tài khoản dường như được ký một cách chính xác; nó hoạt động tốt dưới MacOS/X 10.11.x và 10.12.x; Gatekeeper là tốt với nó trên tất cả các phiên bản MacOS, "spctl --assess", và "codesign -vvvv" tất cả đều nói rằng nó thỏa mãn yêu cầu của nó trên tất cả các phiên bản hệ điều hành), tuy nhiên sẽ không khởi chạy trong OS/X 10.10.x - dưới 10.10.x khi tôi thử để khởi động nó, tôi nhận được một báo cáo tai nạn nơi dyld phàn nàn rằng một số các thư viện không đăng nhập một cách chính xác:Tiện ích mã hóa của Apple quyết định thuật toán SHA nào để ký một thư viện được chia sẻ với?
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'
trong khi điều tra vấn đề đó, tôi nhận thấy rằng các thư viện trong .app/Contents/Khung - tất cả đều được ký bằng cách sử dụng lệnh codesign cùng chính xác, thông qua tập lệnh build/package trên máy xây dựng OS/X của chúng tôi đang chạy OS/X 10.12 - có các loại băm khác nhau được tính toán cho chúng.
Nghĩa là, nếu tôi nhìn vào cách một trong các file không Qt .dylib đã được ký kết, tôi thấy nó đã chỉ một hash sha256 ghi trong đó:
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
... nhưng nếu tôi nhìn như thế nào trong các khuôn khổ Qt bị giam cầm đã được ký kết, OTOH, tôi thấy nó đã cả sha1 và băm sha256 bao gồm:
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
cho rằng lỗi dyld khi cố gắng chạy ứng dụng của tôi dưới Yosemite luôn đề cập đến một trong những thư viện mà chỉ có một băm sha256, lý thuyết làm việc của tôi là OS/X 10.10.x của dyld là đủ cổ t Hat nó không biết về băm SHA-256, và đó là lý do tại sao nó là lỗi khi nó cố gắng để tải một thư viện được chia sẻ bị giam giữ được ký chỉ với một băm SHA-256.
Câu hỏi của tôi (giả sử tôi không hoàn toàn sủa cây sai ở đây) là: làm thế nào để codesign quyết định khi nào để đóng một tệp có băm sha256, so với thêm cả sha1 và băm sha256? Và làm thế nào tôi có thể buộc codesign để luôn luôn bao gồm cả băm, để ứng dụng của tôi có thể khởi động dưới 10.10.x một lần nữa (như nó được sử dụng để trước khi chúng tôi nâng cấp máy xây dựng của chúng tôi để OSX/Sierra)? Đối với hồ sơ, đây là cách tôi gọi codesign trong kịch bản xây dựng của tôi - các đối số gọi là chính xác giống nhau cho tất cả các thư viện (cả thư viện khung Qt kết thúc bằng sha1, sha256 và không phải Qt thư viện mà kết thúc với chỉ sha256), ví dụ:
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"
Xin chào Tôi hiện đang Bạn phải thêm dòng xuất ở đầu tập lệnh được sử dụng để tạo ứng dụng của riêng mình hoặc bạn đã thêm các dòng xuất đó trong dòng lệnh, trước khi xây dựng lại bên thứ ba libs như libsndfile? – nmud
Tôi có tập lệnh xây dựng cấp cao nhất gọi xuống các tập lệnh xây dựng cấp thấp hơn để xây dựng thư viện và sau đó là một tập lệnh xây dựng cấp thấp hơn để xây dựng ứng dụng của tôi sử dụng các thư viện đó. Tôi đặt các lệnh xuất ở trên ở đầu tập lệnh xây dựng cấp cao nhất này để các biến môi trường LDFLAGS, CFLAGS và CXXFLAGS có mặt trong môi trường cho tất cả các kịch bản lệnh xây dựng (thư viện và ứng dụng). –
Được rồi. Trong trường hợp của tôi, tôi đang xây dựng một ứng dụng Qt, vì vậy tôi sẽ phải xây dựng lại các libs bên thứ ba trước với những lá cờ được xuất khẩu, và sau đó xây dựng lại ứng dụng của riêng tôi khi libs là ok. Thing là tôi đã xây dựng libs bên thứ 3 như libsndfile với brew, vì vậy tôi không biết nếu tôi có thể làm một cái gì đó như ./configure CFLAGS = "..." hoặc không – nmud