2017-01-26 23 views
6

Đầ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" 

Trả lời

7

Sau rất nhiều googling xung quanh, this answerthis answer dẫn tôi vào dung dịch.

Vấn đề là một số thư viện chia sẻ của bên thứ ba được bao gồm trong ứng dụng của tôi đã được biên dịch bằng cách sử dụng cài đặt mặc định của chúng (ví dụ: "./configure; make") và vì chúng được biên dịch trong OS/X 10.12, tự nhiên chúng được biên soạn với chỉ 10.12-khả năng tương thích trong tâm trí.

Để nhận được chúng để biên dịch theo cách như vậy mà kết quả là các file .dylib sẽ là thích hợp cho OS/X phiên bản trước là tốt, tôi đã thêm những dòng này vào đầu xây dựng kịch bản của tôi:

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

... và điều đó đã thực hiện thủ thuật cho tất cả các thư viện (libssh2, libsndfile, libogg, libflac, libvorbis, v.v.) ngoại trừ libssl - cho rằng tôi phải sửa đổi cấu hình tệp và chèn - đối số mmacosx-version-min vào các đối số dòng lệnh của trình biên dịch theo cách đó.

Với thay đổi đó, mã vạch hiện áp dụng cả băm SHA-1 và SHA-256 cho tất cả.các tệp dylib và kết quả .app hiện chạy như mong đợi dưới 10.10.x.

+0

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

+0

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). –

+0

Đượ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

1

Câu trả lời của Jeremy Friesner 1 có hiệu quả đối với tôi. Chỉ là một bên không biên soạn OpenSSL. Ít nhất cho 1.0.2h không cần phải thay đổi cấu hình tập tin. Sau đây làm việc tốt

./configure darwin64-x86_64-cc chia sẻ --openssldir = $ HOME/cmake_builds/openssl-1.0.2h.bin -mmacosx phiên bản-min = 10,10

+0

Điều này có thể được đặt tốt hơn làm nhận xét cho câu trả lời của tôi hơn là câu trả lời riêng. –

Các vấn đề liên quan