2016-10-04 69 views
4

我正在做一個需要使用兩個變量的Mac代理,每次用戶下載代理時都需要設置這兩個變量,我的第一個嘗試是修改Info.plist文件併爲Sparkle執行簽名,但在那之後,我意識到,每次我修改該文件,然後執行簽名,該簽名會從已下載的代理商不同,可能導致與旌宇一個問題:如何修改後的應用程序的源代碼? xCode-Sparkle

  • Segue公司出於安全考慮因爲Sparkle正在將可執行代碼下載到用戶的系統中,所以您必須非常小心安全性。 爲了讓旌宇知道下載的更新不被破壞,並從你(而不是惡意攻擊者)排 ,我們建議:列表項

    • 代碼簽名具有DSA簽名匹配公衆所發佈的更新檔案包含在您的應用程序中的DSA密鑰。
  • https://sparkle-project.org/documentation/

    就如何實現這一目標的任何建議嗎?

    下面是我在做修改並執行簽名的腳本:

    import plistlib, sys, tempfile, subprocess, os, datetime 
    
    
    # Read the plist file generated by xCode, and write the OrganizationID and OrganizationToken. 
    plist_file = plistlib.Plist.fromFile("Agent.app/Contents/Info.plist") 
    plist_file['OrganizationID'] = sys.argv[1] 
    plist_file['OrganizationToken'] = sys.argv[2] 
    
    
    plistlib.writePlist(plist_file, "Agent.app/Contents/Info.plist") 
    
    VERSION = plist_file['CFBundleVersion'] 
    DOWNLOAD_BASE_URL="https://url/core/mac/agent" 
    RELEASENOTES_URL= DOWNLOAD_BASE_URL + "/release-notes.html#version-$VERSION" 
    ARCHIVE_FILENAME="Agent %s.zip" % str(VERSION) 
    DOWNLOAD_URL="%s/$%s" % (DOWNLOAD_BASE_URL, ARCHIVE_FILENAME) 
    KEYCHAIN_PRIVKEY_NAME="sparkle_private_key/dsa_priv.pem" 
    os.environ['openssl']= "/usr/bin/openssl" 
    SIGNATURE= '$openssl dgst -sha1 -binary < "%s" | $openssl dgst -dss1 -sign "%s" | $openssl enc -base64' % (ARCHIVE_FILENAME, KEYCHAIN_PRIVKEY_NAME) 
    signature = subprocess.check_output(SIGNATURE, shell=True).strip() 
    SIZE = 'stat -f %%z "%s"' % ARCHIVE_FILENAME 
    size = subprocess.check_output(SIZE, shell=True).strip() 
    PUBDATE = 'LC_TIME=en_US date +"%a, %d %b %G %T %z"' 
    pubdate = subprocess.check_output(PUBDATE, shell=True).strip() 
    
    
    xml = '''<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"> 
    <channel> 
    <title>Update</title> 
    <link> 
    http://sparkle-project.org/files/sparkletestcast.xml 
    </link> 
    <description>Most recent changes with links to updates.</description> 
    <language>en</language> 
    <item> 
    <title>Version %s</title> 
    <sparkle:releaseNotesLink> 
    %s 
    </sparkle:releaseNotesLink> 
    <pubDate>%s</pubDate> 
    <enclosure 
    url="%s" 
    sparkle:version="%s" 
    type="application/octet-stream" 
    length="%s" 
    sparkle:dsaSignature="%s" 
    /> 
    </item> 
    </channel> 
    </rss>''' % (VERSION, RELEASENOTES_URL, pubdate, DOWNLOAD_URL, VERSION, size, signature) 
    

    回答

    1

    如果你的意思是每個用戶的下載應該得到一個唯一的束(束,其Info.plist中已修改)下載,即你打算爲每次下載重新計算一個新的DSA簽名(這就是你的問題可以被理解的方式),你打算做的並不是HTTP緩存友好(你的服務器,也不是你的服務器和最終用戶之間的任何東西)機器將能夠緩存正在下載的應用程序存檔)。除非正在下載的軟件包很小,否則我會不鼓勵這樣做。事實上,現在幾乎需要Developer ID signing才能讓您的軟件在大多數Mac上輕鬆成功部署(Sierra使未簽名的應用部署更加困難),您需要重新創建Sparkle的DSA簽名(實際上是可選的,請參閱下面的內容),但在Info.plist內容更改後使用codesign重新簽署應用程序包內容,這意味着服務於您的代理程序下載的服務器需要運行macOS幷包含開發人員工具。

    順便說一句,DSA簽名驗證由旌宇is optional完成,如果應用程序是不是開發者ID簽名只是做(或者如果appcast都通過HTTP - which is otherwise also vulnerable to exploits)。

    如果不瞭解更多關於您打算保留的每用戶狀態的信息,我會建議一些方案,讓您的應用程序調用回您的服務來獲取變量值(例如傳入輸入某些主機標識,如MAC addressserial number的一些醃製散列,或者甚至只是某些每個用戶創建的隨機值,如果用戶篡改該值不重要,則存儲在用戶默認值中),並且還會執行runtime signature validations when the app is running以確保結束用戶不會篡改應用程序。

    我希望這有助於!我不知道根據它的放置情況,我的問題很正確。