我正在做一个需要使用两个变量的Mac代理,这两个变量需要在用户每次下载代理时设置,我的第一次尝试是修改Info.plist文件并为Sparkle签名,但之后我意识到每次修改该文件并执行签名时,该签名将与已经下载的代理不同,可能会导致Sparkle的问题:
- code-signing the published update archive with a DSA signature matching a public DSA key included in your app.
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)发布于 2016-10-14 13:51:19
如果您的意思是每个用户下载都应该得到一个独特的包(其Info.plist已被修改)来下载,即您打算为每一个下载再次计算一个新的DSA签名(这就是如何理解您的问题),那么您打算做的不是非常友好的HTTP缓存(您的服务器或服务器和最终用户机器之间的任何东西都不能缓存正在下载的应用程序存档)。除非下载的包很小,否则我会阻止这样做。事实上,由于现在几乎需要开发人员ID签名才能轻松地将您的软件部署到大多数Mac上(塞拉利昂使未经签名的应用部署更加困难),您不仅需要重新创建Sparkle的DSA签名(实际上是可选的,见下文),还需要在Info.plist内容更改后使用codesign重新签名应用程序包内容,这意味着为代理下载提供服务的服务器需要运行macOS并包含开发工具。
顺便说一句,DSA签名验证是由是可选的完成的,并且只有当应用程序没有经过开发者ID签名(或者应用程序是通过HTTP-,否则也容易受到攻击。提供的)时才能完成。
在不了解您打算保留什么样的每个用户状态的情况下,我会提出一种方案,在这种方案中,您的应用程序将调用您的服务来获取变量值(例如,传入一些输入主机标识,例如MAC地址或序列号的一些咸散列,甚至只是一些用户创建的随机值,如果用户篡改它并不重要,则存储在用户默认值中),并且您还会做运行应用程序时的运行时签名验证,以确保最终用户不会篡改应用程序。
我希望这能帮到你!我不太清楚你的问题是怎么提出的。
https://stackoverflow.com/questions/39862320
复制相似问题