2015-01-14 4 views
4

У меня возникли проблемы с подписями приложения на основе Qt без OS X. Я использую Qt 5.3.2.Невозможно подписать приложение с использованием фреймворков Qt на OS X 10.10

Я читал различные источники информации, содержащие противоречивую информацию.

Вот содержание моего пакета приложения после того, как я запустить утилиту bin/macdeployqt Qt

SimpleHello.app/ 
    Contents/ 
     Info.plist 
     PkgInfo 
     Frameworks/ 
      QtCore.framework/ 
       Resources/ 
       Versions/ 
        5/ 
         QtCore 
      QtGui.framework/ ... same as Qt core 
      QtPrintSupport.framework/ ... same as Qt core 
      QtWidgets.framework/ ... same as Qt core 
     MacOS/ 
      SimpleHello 
     PlugIns/ ... some plugins 
     Resources/ 
      empty.lproj 
      qt.conf 

Первое:

Я пробовал: http://successfulsoftware.net/2012/08/30/how-to-sign-your-mac-os-x-app-for-gatekeeper/

Тем не менее, кажется, что это не так действителен в OS X 10.10 Yosemite

Во-вторых:

Я пробовал: Sign a Framework for OSX 10.9

Я был в состоянии подписать все приложения без каких-либо ошибок. Тем не менее, при выполнении spctl для проверки обоснованности применения, я получаю

spctl -a -vvvv SimpleHello.app 
SimpleHello.app/: rejected 
source=obsolete resource envelope 
origin=Developer ID Application: MY CERTIFICATE 

Кроме того при проверке подписи с CodeSign, я получаю это:

codesign --verify --deep --verbose=4 SimpleHello.app 
--prepared:/My/Path/SimpleHello.app/Contents/Frameworks/QtCore.framework 
--validated:/My/Path/SimpleHello.app/Contents/Frameworks/QtCore.framework 
SimpleHello.app/: embedded framework contains modified or invalid version 
In subcomponent: /My/Path/SimpleHello.app/Contents/Frameworks/QtCore.framework 

Третье:

добавившие --no-strict опция в отношении кодов в соответствии с: Error when export archive

Он исправляет проблему с проверкой кода, но не исправляет проблему spctl.

Forth:

Я попытался добавить опцию --no-legacy-signing при подписании рамок. Однако я получаю эту ошибку при проверке пучка подписи (как с codesign и spctl

codesign --verify --deep --verbose=4 SimpleHello.app 
SimpleHello.app/: code has no resources but signature indicates they must be present 

Пятое:

Модифицированный каркасную структуру в соответствии с: http://qt-project.org/forums/viewthread/47768 и https://gist.github.com/kingcheez/6154462d7734e0c0f3a4

В этом случае я получаю эту ошибку при попытке подписать рамки

SimpleHello.app/Contents/Frameworks/QtCore.framework: unsealed contents present in the root directory of an embedded framework 
SimpleHello.app/Contents/Frameworks/QtGui.framework: unsealed contents present in the root directory of an embedded framework 
SimpleHello.app/Contents/Frameworks/QtPrintSupport.framework: unsealed contents present in the root directory of an embedded framework 
SimpleHello.app/Contents/Frameworks/QtWidgets.framework: unsealed contents present in the root directory of an embedded framework 

EDIT: Кажется, проблема с unsealed contents present in the root directory of an embedded framework состояла в том, что одна из симлинков была искажена.Это было:

QtCore.framework.framework/Versions/Current -> 5/ 

Вместо

QtCore.framework.framework/Versions/Current -> 5 

После исправления, я все еще получаю тот же результат, как и в Шестой хотя.

Шестые:

Добавлена ​​--no-strict опции при вызове codesign для рамочных. Я был в состоянии подписать все рамки, за исключением одного

SimpleHello.app//Contents/Frameworks/QtCore.framework: signed bundle with Mach-O thin (x86_64) [.] 
SimpleHello.app//Contents/Frameworks/QtGui.framework: signed bundle with Mach-O thin (x86_64) [.] 
SimpleHello.app//Contents/Frameworks/QtPrintSupport.framework: code object is not signed at all 
In subcomponent: /My/Path/SimpleHello.app/Contents/Frameworks/QtPrintSupport.framework/Versions/Current/QtPrintSupport 
SimpleHello.app//Contents/Frameworks/QtWidgets.framework: signed bundle with Mach-O thin (x86_64) [.] 

Седьмое:

я отправил этот вопрос, так как я не знаю, что искать больше

ответ

2

Порывшись немного больше, я понял, что этот вопрос в разделе седьмого был: Некоторые Qt Framework содержат неверную информацию в Info.plist файлов (имя рамки заканчивается _DEBUG)

Я пришел с этим скриптом, который фиксирует все вопросы (есть еще несколько значений, которые жестко закодированных, вероятно, могут получить обрабатываемые с некоторым улучшением сценария)

#!/bin/bash 
# Script name: deploy.sh 

# Following environment variables must be defined: 
# - QT_FRAMEWORK_PATH 
# - QT_BIN_PATH 
# - CERTIFICATE 
# - FRAMEWORKS 
# - BAD_FRAMEWORKS 


# retrieve bundle name from first parameter 
BUNDLE_NAME=$1 

# Run QT tool to deploy 
${QT_BIN_PATH}/macdeployqt $BUNDLE_NAME 

# FIX ISSUE 6 
# Please note that Qt5 frameworks have incorrect layout after SDK build, so this isn't just a problem with `macdeployqt` but whole framework assembly part. 
# Present 
# QtCore.framework/ 
#  Contents/ 
#   Info.plist 
#  QtCore -> Versions/Current/QtCore 
#  Versions/ 
#   Current -> 5 
#   5/ 
#    QtCore 
# After macdeployqt 
# QtCore.framework/ 
#  Resources/ 
#  Versions/ 
#   5/ 
#    QtCore 
# 
# Expected 
# QtCore.framework/ 
#  QtCore -> Versions/Current/QtCore 
#  Resources -> Versions/Current/Resources 
#  Versions/ 
#   Current -> 5 
#   5/ 
#    QtCore 
#    Resources/ 
#     Info.plist 
# So in order to comply with expected layout: https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html 

for CURRENT_FRAMEWORK in ${FRAMEWORKS}; do 
    echo "Processing framework: ${CURRENT_FRAMEWORK}" 

    echo "Deleting existing resource folder" 
    rmdir ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Resources 

    echo "create resource folder" 
    mkdir ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Versions/5/Resources 

    echo "create copy resource file" 
    cp ${QT_FRAMEWORK_PATH}/${CURRENT_FRAMEWORK}.framework/Contents/Info.plist $BUNDLE_NAME/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Versions/5/Resources/ 

    echo "create symbolic links" 
    ln -s 5          ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Versions/Current 
    ln -s Versions/Current/${CURRENT_FRAMEWORK} ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/${CURRENT_FRAMEWORK} 
    ln -s Versions/Current/Resources   ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Resources 
done 

# FIX ISSUE 7 
echo "***** Correct Frameworks Info.plist file*****" 

for CURRENT_FRAMEWORK in ${BAD_FRAMEWORKS}; do 
    echo "Correcting bad framework Info.plist: ${CURRENT_FRAMEWORK}" 
    TMP=$(sed 's/_debug//g' ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Resources/Info.plist) 
    echo "$TMP" > ${BUNDLE_NAME}/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework/Resources/Info.plist 
done 

# SIGNING FIXED FRAMEWORK 
CODESIGN_OPTIONS="--verbose=4" 

echo "******* Signing Frameworks ***********" 
for CURRENT_FRAMEWORK in ${FRAMEWORKS}; do 
    echo "Signing framework: ${CURRENT_FRAMEWORK}" 
    codesign --force --verify ${CODESIGN_OPTIONS} --sign "$CERTIFICATE" $BUNDLE_NAME/Contents/Frameworks/${CURRENT_FRAMEWORK}.framework 
done 

# Sign plugins 
echo "******* Signing Plugins ***********" 
codesign --force --verify ${CODESIGN_OPTIONS} --sign "${CERTIFICATE}" ${BUNDLE_NAME}/Contents/Plugins/accessible/libqtaccessiblequick.dylib 
codesign --force --verify ${CODESIGN_OPTIONS} --sign "${CERTIFICATE}" ${BUNDLE_NAME}/Contents/Plugins/accessible/libqtaccessiblewidgets.dylib 
# ... Do the same for all plugins 

# Sign bundle itself 
echo "******* Signing Bundle ***********" 
codesign --force --verify ${CODESIGN_OPTIONS} --sign "$CERTIFICATE" $BUNDLE_NAME 

# Verify 

echo "******* Verify Bundle ***********" 
codesign --verify --deep ${CODESIGN_OPTIONS} $BUNDLE_NAME 


echo "******* Verify Bundle using dpctl ***********" 
spctl -a -vvvv $BUNDLE_NAME 

Как для вызова скрипта:

# Define environment variables 
export QT_FRAMEWORK_PATH=/Path/To/Qt_5.3.2/5.3/clang_64/lib 
export QT_BIN_PATH=/Path/To/Qt_5.3.2/5.3/clang_64/bin 
export CERTIFICATE="Developer ID Application: My Certificate" 
export FRAMEWORKS="QtCore QtGui QtPrintSupport QtWidgets" 
export BAD_FRAMEWORKS="QtPrintSupport" 

# Call itself 
deploy.sh SimpleHello.app 

С помощью этого скрипта, окончательный вывод:

SimpleHello.app/: accepted 
source=Developer ID 
origin=Developer ID Application: My Certificate (HASH) 
+0

Отличный человек! Наконец, рабочее решение. Не забудьте использовать cp -R, чтобы скопировать приложение в возможные скрипты, иначе сигнатура будет нарушена. – Indio

0

Я бегу сценарий, аналогичный это после того, как работает macdeployqt:

#!/bin/bash 

#copy .plist files to frameworks 
cp "/usr/local/Trolltech/Qt-4.8.5/lib/QtCore.framework/Contents/Info.plist" "SimpleHello.app/Contents/Frameworks/QtCore.framework/Resources/Info.plist" 
#copy folders to proper location 
cp -r "SimpleHello.app/Contents/Frameworks/QtCore.framework/Resources" "SimpleHello.app/Contents/Frameworks/QtCore.framework/Versions/4/Resources" 
#delete old folders 
rm -rf "SimpleHello.app/Contents/Frameworks/QtCore.framework/Resources" 
#create symlinks 
ln -s "Versions/4/Resources" "SimpleHello.app/Contents/Frameworks/QtCore.framework/Resources" 

после, я использую:

codesign --deep -f -s 

и он работает, просто добавьте недостающие рамки таким же образом. Я не пробовал его с qt 5+, но для этого он мог бы работать.

+0

К сожалению, это does't исправить все проблемы. Похоже, что для некоторых Qt 5+ Frameworks Info.plist содержит ошибки, которые необходимо исправить до подписания. Я также удивлен, что ваше решение работает, поскольку с OS X 10.9+ в Framework должно быть 3 символических ссылки. Я опубликовал решение, которое, наконец, сработало для меня. – gfrigon

+0

@gfrigon Я буквально просто скопировал одну строку каждого шага и заменил имя моего приложения тем, что вы использовали. Когда я сделал скрипт, я делал выделение проб и ошибок, мне никогда не приходилось добавлять еще две символические ссылки, я использую Xcode 6.0.1 – Dragarro

+0

Используете ли вы OS X 10.10? Похоже, что эта версия более сложная, чем ранние версии структуры. Я повторно протестировал ваше решение, просто чтобы убедиться (добавление исправления файла bad info.plist в фреймворках Qt 5.3.2), и он не выполняет проверки Gatekeeper. Спасибо за помощь и отзывы. – gfrigon