2016-11-14 2 views
1

Je suis complètement intrigué par le système de signature Apple. Ça me rend fou.Gatekeeper rejette mon lot d'applications

J'ai une application Qt (ne passant pas par l'écosystème XCode) que je suis en train de signer manuellement sur macOS 10.12.

Après la signature, je cours codesign --verify --deep --strict verbose = 2 PATHTOAPP tel que recommandé ici: https://developer.apple.com/library/content/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG211

Et je reçois:

valid on disk satisfies its Designated Requirement

Quel est le prévu, résultat valide.

Quand je codesign -dv verbose = 4 PATHTOAPP je reçois:

Authority=Developer ID Application: MYAPPLEID Authority=Developer ID
Certification Authority Authority=Apple Root CA
Sealed Resources version=2

Quand je lance contre l'outil check-signature fourni par Apple, je reçois un OUI qui signifie qu'il est correctement signé.

Mais quand je le lance contre spctl -a -t exec -vv PATHTOAPP je reçois un:

rejected (embedded framework contains modified or invalid version)

Et à la fin, Gatekeeper rejette mon application

Malheureusement, l'utilitaire spctl ne le fait pas donnez-moi une idée de ce qui ne va pas et où regarder. Je ne comprends pas, puisque le codeign avec les drapeaux les plus profonds et les plus stricts dit que c'est ok.

Une idée sur la façon dont je peux obtenir plus d'informations?

EDIT1: J'ai couru spctl --assess --raw --verbose PATHTOAPP et je reçois ceci:

<key>assessment:authority</key> 
<dict> 
    <key>assessment:authority:flags</key> 
    <integer>0</integer> 
    <key>assessment:authority:source</key> 
    <string>obsolete resource envelope</string> 
    <key>assessment:authority:weak</key> 
    <true/> 
</dict> 
<key>assessment:cserror</key> 
<integer>-67009</integer> 
<key>assessment:remote</key> 
<true/> 
<key>assessment:verdict</key> 
<false/> 

Maintenant, je ne sais pas quoi croire, est-il « cadre intégré modifié contiennent les ou une version invalide "ou est-ce" enveloppe de ressources obsolète "(et pourquoi)?

Quand je vérifie les codes d'erreur ici: https://github.com/CamJN/Security/blob/77b26b3e434caec74403da43bcfb02532a25d7ff/libsecurity_codesigning/lib/CSCommon.h

Je vois:

errSecCSWeakResourceRules =   -67013, /* resource envelope is obsolete */ 
errSecCSBadFrameworkVersion =  -67009, /* embedded framework contains modified or invalid version */ 

EDIT2: Il est vraiment le contenu de mon dossier cadres qui est à l'origine du problème. Quand je supprime tout ce qu'il y a dedans avant de le signer, il passe la validation de spctl.

Le problème est, si je viens de laisser un seul, cadre pur tel que QtCore (de Qt 5.7.0) J'obtient l'erreur immédiatement spctl:

rejected (embedded framework contains modified or invalid version)

+0

Si vous utilisez 'macdeployqt', vous pouvez utiliser l'argument' -codesign' et le faire signer pour toi. – TheDarkKnight

Répondre

0

Transforme le contenu de chaque cadre a manqué la CADRE.Cadre/Versions/symlink actuel

symlinks requis:

FRAMEWORK.framework/Resources 
FRAMEWORK.framework/Versions/Current 

scénario Facile à créer thoses liens symboliques (alors que dans le dossier Cadres):

find . -path '*.framework/Versions/[0-9]' -and -not -type l -print0 | while read -d $'\0' FRMPATH 
    do 
     ln -s ${FRMPATH/*framework\//}/Resources $FRMPATH/../../Resources 
     ln -s ${FRMPATH/*Versions\//} $FRMPATH/../Current 
    done 

J'ai aussi découvert une commande qui fait Gatekeeper accepte certificat auto-signé (utile lorsque vous n'avez pas d'identifiant Apple Developer mais que vous devez tester contre spctl):

spctl --add --requirement "certificate leaf[subject.CN] = \"MY CERTIFICATE\"" --label "MyCustomCertificate" 

(où MY CERTIFICATE doit être remplacé par le nom de votre propre certificat auto-signé/auto-généré)