4

私は 2 つの変数を使用する必要がある Mac エージェントを実行しています。これらの 2 つの変数は、ユーザーがエージェントをダウンロードするたびに設定する必要があります。私の最初の試みは、Info.plistファイルを変更して Sparkle の署名を行うことでしたが、その後、次のことに気付きました。そのファイルを変更して署名を行うたびに、その署名は既にダウンロードされているエージェントとは異なり、Sparkle で問題を引き起こす可能性があります。

  1. セキュリティ上の懸念がある場合のセグエ Sparkle は実行可能コードをユーザーのシステムにダウンロードするため、セキュリティについて十分に注意する必要があります。ダウンロードされた更新が破損しておらず、(悪意のある攻撃者ではなく) あなたからのものであることを 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)
4

1 に答える 1

1

ダウンロードするすべてのユーザーがダウンロードする一意のバンドル (Info.plist が変更されたバンドル) を取得する必要があることを意味する場合、つまり、ダウンロードごとに新しい DSA 署名を再度計算するつもりである場合 (それがあなたの質問を理解できる方法です)、あなたがしようとしていることは、HTTP キャッシュにあまり適していません (あなたのサーバーも、あなたのサーバーとエンド ユーザーのマシンの間にあるものも、ダウンロード中のアプリ アーカイブをキャッシュできません)。ダウンロードするバンドルが小さい場合を除き、私はそうしないことをお勧めします。実際、ほとんどの Mac にソフトウェアを問題なくデプロイするには開発者 ID の署名が実質的に必要なので (Sierra では署名のないアプリのデプロイがさらに困難になります)、Sparkle の DSA 署名だけでなく再作成する必要があります (これは実際にはオプションです。下記参照)、codesignInfo.plist のコンテンツが変更された後にアプリ バンドルのコンテンツ自体に再署名するには、エージェントのダウンロードを提供するサーバーが macOS を実行し、開発者ツールが含まれている必要があります。

ちなみに、Sparkle によって行われる DSA 署名の検証はオプションであり、アプリが開発者 ID で署名されていない場合 (または appcast が HTTP 経由で提供されている場合) にのみ行われます

保持しようとしているユーザーごとの状態の種類について詳しくわからない場合は、アプリが変数値を取得するために自分のサービスにコールバックするようなスキームを代わりに提案します (たとえば、入力にホスト ID を渡すなど)。MACアドレスまたはシリアル番号のソルトハッシュ、またはユーザーが改ざんすることが重要でない場合は、ユーザーのデフォルトに保存されるユーザーごとに作成されたランダム値の一部としても)、アプリの実行時にランタイム署名の検証も行いますエンド ユーザーがアプリを改ざんしていないことを確認します。

これが役立つことを願っています!あなたの質問がどのように配置されたかに基づいて、私があなたの質問を完全に正しく理解したかどうかはわかりません.

于 2016-10-14T13:51:19.663 に答える