Vraag Ondertekening van de OS X-app op Windows (zonder codesign)


Ik heb een Windows-toepassing die onder Wine kan worden uitgevoerd onder OS X. Voor het gemak wil ik de applicatie inpakken als OS X-app (ZIP-archief van xxx.app map op basis van WineBottler).

Merk op dat het hoofdbestand van de app (zoals gedefinieerd door CFBundleExecutable tag van Info.plist) is een shellscript, geen binair getal.

Ik wil de toepassing ondertekenen om door OS X Gatekeeper te gaan. Omdat mijn complete bouwproces op Windows draait (en omdat ik eigenlijk helemaal geen Mac heb) moet ik het ondertekenen op Windows.

Ik heb al gemerkt dat het ondertekenen van de app creëert _CodeSignature map met vier bestanden:

CodeDirectory
CodeRequirements
CodeResources
CodeSignature

Ik heb geen specificaties gevonden die de inhoud van deze bestanden beschrijven.

Experimenteel heb ik dat gevonden CodeResources is een XML-bestand met SHA-1 hashes van alle bestanden in de app. Ik kan dat genereren.

De inhoud van CodeRequirements binair bestand lijkt te zijn opgelost. Het lijkt niet te veranderen met de inhoud van de app. Bevestiging wordt op prijs gesteld. Waar is dit bestand goed voor?

Wat betreft de binaire bestanden CodeDirectory en CodeSignature Ik heb geen idee.

Beide bestanden veranderen met app-inhoud. Het lijkt erop dat elke wijziging in het app-bestand (inclusief het platte-tekstlicentiebestand) hierop van invloed is.

De CodeSignature bevat duidelijk de handtekening. Ik kan platte-tekstinformatie over het certificaat van code-ondertekening in het bestand zien. Is er een tool die het bestand kan genereren? Omdat het een handtekening is, zou het vrij standaard moeten zijn. Hoewel er extra binaire metadata kunnen zijn die de generatie moeilijker kunnen maken. Weet iemand wat het specifiek ondertekent? Ik kan me voorstellen dat het alleen tekent CodeResources bestand dat alle andere bestanden in de app beschrijft. Of ondertekent het feitelijk alle bestanden in de app recursief?

Native OS X-apps hebben CodeResources enkel en alleen. Er zit dus eigenlijk geen handtekening in _CodeSignature. Ik denk dat het komt omdat ze een ingesloten handtekening hebben in het hoofdbare binaire bestand. Merk op dat mijn binaire bestand [Windows] (hoewel er niet rechtstreeks naar wordt verwezen door Info.plist zoals hierboven vermeld) is gecodeerd met Windows signtool.exe. Blijkbaar herkent OS X de handtekening zelfs zonder de referentie als codesign -d -vvv xxx.app uitvoer bevat informatie over het certificaat:

Executable=/Applications/WinSCP.app/Contents/MacOS/startwine
Identifier=WinSCP
Format=bundle with generic
CodeDirectory v=20100 size=135 flags=0x0(none) hashes=1+3 location=embedded
Hash type=sha1 size=20
CDHash=a1ef4f04b2c1b4b793788ce3ab9d7881528f3d95
Signature size=4867
Authority=Martin Prikryl
Authority=VeriSign Class 3 Code Signing 2010 CA
Authority=VeriSign Class 3 Public Primary Certification Authority - G5
Signed Time=23.4.2014 23:51:18
Info.plist entries=14
Sealed Resources version=2 rules=12 files=846
Internal requirements count=2 size=136

Verwarrend is dat het helemaal geen binaire naam is. Hoe dan ook, het maakt Gatekeeper niet gelukkig. Merk op dat de bovenstaande test wordt uitgevoerd tegen de app die al is inbegrepen CodeResources bestand (dat is waarschijnlijk wat de Sealed Resources version verwijst ook als rules en files tellingen komen overeen met de inhoud van het bestand).


13
2018-04-30 06:59


oorsprong


antwoorden:


We hebben geprobeerd de ondertekening van code met behulp van de broncode van libsecurity_codesigning bibliotheek. Hoewel het haalbaar lijkt, is het nog steeds te veel moeite, dus we overwegen het opgeven. We willen op zijn minst delen wat we tot nu toe hebben gevonden, zodat anderen kunnen voortbouwen.

We hebben ontdekt dat wanneer codesign vindt MachO niet binair, het is terug te voeren naar "architectuur agnostische" ondertekening geïmplementeerd SecCodeSigner::Signer::signArchitectureAgnostic.

Belangrijke stappen daar:

  • CodeDirectory bestands generatie. De map bevat enkele SHA-1 hashes van verschillende delen van de bundel naast de bestandsheader (inclusief directoryversie)
  • CodeSignaturebestands generatie. De kenmerkende tekens CodeDirectory bestand met de indeling Cryptographic Message Syntax (CMS). De handtekening kan op elk platform met behulp van OpenSSL worden geverifieerd:

    openssl cms -verify -in CodeSignature -inform DER
        -content CodeDirectory -noverify -out CodeDirectory.verified
    

    Let daar op -noverify is nodig om certificaatvalidatie over te slaan, omdat OpenSSL geen ondersteuning biedt voor "code ondertekening" van certificaten.

    OpenSSL moet een CMS-handtekening kunnen maken met behulp van de volgende opdracht:

    openssl cms -sign -in CodeDirectory -out CodeSignature 
        -signer certificate.pem -outform DER
    

    Maar een dergelijke handtekening wordt niet geaccepteerd door OS X.

We kwamen niet verder.


7
2018-05-15 04:44



Niet strikt aanmelden bij Windows, maar hebt u Remote Desktop beschouwd als een vrienden-Mac of een Mac in de cloud gehuurd? http://www.macincloud.com lijkt redelijk redelijke plannen te hebben.

Kan veel van de problemen besparen. Het enige dat u echt nodig hebt, is de tool voor codesigning en de terminal.

Bewerken: u hebt nog steeds een Apple Developer-account nodig om de toepassing te ondertekenen. Gatekeeper biedt alleen handtekeningen van door Apple uitgegeven ID-certificaten voor ontwikkelaars.


3
2018-05-14 01:39