2013-06-06 10 views
19

私の会社は、サーバー用のJavaアプリケーションを作成し、JNLPファイルを提供してローカルアプリケーションを開始します。 OSX 10.8.4以来、ゲートキーパーを幸せにするために開発者IDでJNLPファイルに署名する必要があります(実際はrelease notesの一番下にあります)。OSXとゲートキーパー用の(動的)JNLPファイルへの署名方法

質問は次のとおりです。これを達成する方法は? AFAIKではAppsに署名できます(開発者IDで署名されたJavaアプリケーションがいくつかあります)が、JNLPはファイルです。

次は、生成されたJNLPファイルでこれを行う方法です。サーバーから来たものを変更する必要があります。プロパティ、ベースURLなどが含まれます。

AFAIK Java has a certain mechanism言い換えれば、JNLPファイルはそれぞれのJARファイル(メインクラスを保持するファイル)を介して署名されていますが、Jarファイルは別の証明書で署名されているため、Gatekeeperも満たされません。

one reference on how to sign tools and stuffが見つかりましたが、動的ファイルのシナリオは適用されません。

答えとして欲しくないこと:右クリックして開くと、ゲートキーパーが上書きされたり、システム設定やJava設定が変更されたりします。これはオプションではありません。

[UPDATE] OSX 10.9.5以降、OSX 10.9以降を使用してサインインし、有効なバージョン2の署名を取得する必要があります。これはどのようにして行われますか?

答えて

6

解決策が見つかりました。私は現在考えている唯一の人です。基本的には、JNLPをカスタムアプリランチャーでラップし、アプリに署名し、サーバー上でJNLPを即座に変更してから実行できるようにする必要があります。

ご存知のように、JARファイルをOSX実行可能ファイルにまとめることができるアプリバンドラプロジェクトがあります。これは、ゲートキーパーに署名し、配信し、失敗することはありません。私はJNLPファイルを取ることができるカスタムフォークを作成し、それをラップして、JNLPがすべきすべてのものをやっているカスタムアプリケーションを持っています。

要件は、あなたがbitbucket.orgにオーバー頭に

  1. 有効「開発者IDアプリケーションの」証明書を持っており、現在のバージョン
  2. Antタスクを実行し、appbundlerパッケージをビルドをダウンロードしないこと、しかし、です。
  3. アプリのコンテナを作成するサンプルのビルドスクリプトのドキュメントをご覧ください。
    • この例では、現在アプリケーションにJNLPが含まれていません。
    • アプリケーションシグネチャは、後でJNLPファイルを変更できるように作成されます。
    • アプリケーションはzipファイルに入れられています。これはディレクトリのみであるためアプリケーションをダウンロードする場合に重要です
  4. サーバーコードを作成します。 ZIPファイルをロードし、JNLPファイルをディレクトリに入れます。<yourapp>.app/Contents/Java/
  5. zipファイルを配信します。

これですべてがうまくいけば、ダウンロードフォルダにzipファイルが自動的に展開され、アプリケーションアイコンが表示されます。実際に間違えていない場合は、通常のアプリケーションと同じようにアプリケーションを実行できます。

これは、多くの開発者がOSXで壊れたJNLPの動作を修正するのに役立つことを願っています。

[変更可能なJNLPの更新] OSX 10.9.5以降、アプリケーションに有効なバージョン2の署名が必要です。これは、アプリケーションバンドラ(リソースリストファイルの設定)によって以前に使用されていたトリックがもう機能しないことを意味します。すべてと何かが今署名されなければならないし、その後署名されたアプリを変更することは事実上不可能です。

私は方法を見つけました:アプリのバンドラを使用してください。 JNLPをContents/_CodeSignatureディレクトリ内のファイルに設定します。そこに変更可能なJNLPをまだコピーしないでください。後でJavaを使用してzipにパッチを当てる(あなたはここにいくつかのコードが必要です)。

ご注意:あなたがアプリのコンテナに動的に別のJNLPファイルを配置する必要がある場合、これは実際には必要とされなければならない(質問はおよそ何だったのthatsです)

UPDATE(08から2017)

Oracleは9月末までにJava 9をリリースします。 appbundlerはjava9 vmを正しく処理しません。彼らはAPI全体とjavawが動作する方法を変えました。私は言う必要があります:ラップされたJNLPアプリケーションを使用する場合は、java8に固執します。あなたは.dmgを変更することなく、あなたが好きしかし.jnlpを変更することができ、そのよう

javaws http://path/to/my/app.jnlp 

+0

あなたの仕事に感謝します!私は質問がありますが、これはJNLPファイルの更新にどのように対応していますか? – JavaJens

+0

それは難しい部分です。私たちはコンテンツを配信するためにJavaを使用しています。 ZIPファイルを配信する前に、JNLPファイルを作成して既存のZIPファイルに入れます。 ZIPでJNLPファイルを変更しても、APPは署名を変更することはありません(署名プロセスの一部)。しかし、その場でZIPを修正するツールが必要です。 (例:ZipInputStream/ZipOutputStream) – gamma

+0

はい、ただし、JNLP/Appが配信されても​​、JNLPは更新されません。 – JavaJens

5

我々はこのように、あなたは「開発者IDアプリケーションの」証明書を使用して、協調設計とJNLPファイルに署名することを決定することができました:

codesign -f -s "Developer ID Application: " foo.jnlp 

この操作の結果は、上のゲートキーパーを渡しているようですローカルマシン。しかし、署名が拡張HFS属性として格納されているように見えます。その結果、ユーザーがHTTPトランザクションからファイルを取得した場合、署名は送信されません。

.jnlpファイルをとり、.dmgや.tar.gzのような何らかのコンテナにパッケージ化しても動作するかもしれませんが、それは多くの作業であり、挑戦的なユーザーエクスペリエンスアップルの技術サポートと電子メールのスレッドから

+0

ええ、私もこれを理解しました。問題は、ユーザーに配信する前にサーバー上のJNLPファイルを変更する必要があることです。サーバーは必ずしもOSXサーバーである必要はありません。 – gamma

+0

確かに - それを回避することもできます。署名を行うためにMacを設定すると、.jnlpファイルを取得して署名して返す小さなWebサービスを構築することさえできますこのサービスはあなたにのみ利用可能です)。本当の問題は、これらの.jnlpファイルをユーザーに取得する方法と、ユーザーがそれらを起動するために必要なステップです。 .dmgのようなコンテナにこれらをパックする必要がある場合は、ユーザーが起動するためのかなりのプロセスが必要になります。 –

+1

ニースしよう;) - あなたのようなサービスはノーではないと思います。私が思ったのは、ダウンロードしてURLなどを実行して、その後に署名する必要のないJNLPをロードして起動するAppでした。アプリ自体は静的で、どこから来たのかを「知る」必要があります。それがうまくいくのなら、Dunno。 – gamma

3

、公式の単語がcodesignで拡張属性をHFSへの依存を回避するためにxipツールを使用することであると思われる:XIPを使用し、

代わりの協調設計を(発音"チップ") あなたのJNLPファイルの署名付きアーカイブを作成します。開発者 IDインストーラIDを、 開発者IDアプリケーションIDではなく、--signオプションの引数として指定します。

xipアーカイブは基本的に署名付きのzipアーカイブなので、zipアーカイブと同じ方法でインターネット経由で を配信することができます。クライアントのMacでは が自動的にアーカイブされなくなります。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xip.1.html

私の実験からxipツールは常にunxip'dたときに、フォルダに含まれるJNLPでアーカイブを生成します。

+1

https://developer.apple.com/library/content/technotes/tn2206/_index.html XIPは、Sierraを使用しているApple以外の開発者は利用できません。 – amos

2

説明をまとめると、現在、これを回避する方法についての既存の解決策はありません。

これは、エンドユーザーがJNLP経由でアプリケーションを簡単に起動できないことを意味します。基本的には、ゲートキーパを無効にするには、右クリックと開くをユーザーに指示する必要があります。

他の解決策は、署名付きMacアプリケーションを作成し、ユーザーにディスクイメージ経由でインストールさせることです。

0

それはこのようになります署名.dmgに「myappの」のようなものをと呼ばれる簡単な実行可能なシェルスクリプトをバンドルする働くだろう。私はApple Developer IDを持っていないので、今は自分で試してみることはできません。

+0

私はこれを知らない。しかし、dmgのコンテンツはオンザフライで変更することはできません。受け入れられた回答のコンセプトは、投稿してからです。)希望通りに実行できませんでした; – gamma

+0

jnlpsのURLを動的に変更していますか? – amos

+0

JNLPは、Javaバックエンドによってオンザフライで更新されます。ビルドプロセス中にJNLPをパッケージ化すると、エンドユーザが持つURLを知ることができません。 – gamma

関連する問題