3

のセキュリティ制限が厳しくなったため、1 月に予定され7u51ているため、JNLP ファイルに署名しようとしています。

このアプリケーションでは、特定のカスタム システム プロパティを設定する必要があり、これらのプロパティの一部の値は、アプレットがデプロイされている場所によって異なります。デプロイごとに JNLP テンプレートを含む JAR に再署名する必要はありません。

JNLP テンプレートを挿入する単純な方法は<property name="my-prop" value="*"/>機能しません。

テンプレートを使用しても、<property name="my-prop" value="fixed-value"/>「このアプリケーションは安全でない操作を実行しようとしています。続行しますか?」というダイアログが表示されることがあります。

安全でない操作のセキュリティ ダイアログ

システム プロパティを署名付き Java RIA に渡す正しい方法は何ですか?

4

1 に答える 1

6

どちらの場合も、これら 2 つの問題を回避するために、起動時に実行される簡単なコードをアプリケーションに追加する必要があります。

プロパティ値で許可されていないワイルドカード

JNLP仕様には次のように書かれています:

JNLP クライアントは、セキュリティを維持するために、特定の jnlp 要素と引数値 (「java-vm-args」またはプロパティ「name」と「value」など) をブラックリストに登録 (または制限) することが期待されます。正確なリストは、個々の JNLP クライアントの実装次第です。

実際、Oracle の実装 (少なくとも 7u45 では) はvalue、要素の属性をブラックリストに登録します<property/>。ワイルドカードを使用することはできません。この決定の背後にある理由を見つけることはできませんでしたが、それはあります。

Webstart の回避策では、任意のプロパティ名と値を使用できます。アプレットの回避策では、コード署名時にプロパティの名前がわかっている必要があります。

回避策: Webstart

JNLP ファイルに、いくつかのワイルドカード引数を含めます。

<application-desc main-class="com.example.YourMainClass">
  <argument>*</argument>
  <argument>*</argument>
</application-desc>

アプリケーションのmainメソッドで、これらの引数を解析し、 を使用してシステム プロパティにコピーしSystem.setProperty()、リテラル値を持つ引数をスキップします"*"。の最初の出現時に各引数を単純に分割することをお勧めします"="。(アプリケーションがすでに通常の引数も取っている場合は、もう少し工夫する必要があります。)

回避策: アプレット

JNLP ファイルに、設定が必要なシステム プロパティを定義するパラメータを含めます。

<applet-desc main-class="com.example.YourMainClassApplet">
  <param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
  <param name="prop1" value="*"/>
  <param name="prop2" value="*"/>
</applet-desc>

Applet.init()メソッドで、パラメーターの値をSYS_PROPERTY_PARAMETERS取得し、それを反復処理して各パラメーターの値を取得します。リテラルでない場合は、"*"を使用してシステム プロパティにコピーしますSystem.setProperty()

[安全でない操作] ダイアログ

これは、LiveConnect (Java <-> JavaScript 相互作用) の使用によって引き起こされるOracle プラグインのバグです。

回避策: 「安全な」プロパティ プレフィックス

<property/>JNLP の要素を介して設定されたすべてのシステム プロパティの前に を付け"jnlp."ます。

<property name="jnlp.my-prop" value="fixed-value"/>

次に、アプリケーションのmain()またはApplet.init()メソッドで、 のコピーを System.getProperties()反復処理し、プロパティ名が で始まる場合は、"jnlp."その値を同じ名前のプロパティにコピーし、そのプレフィックスを削除します。(を回避するには、コピーを反復処理する必要がありConcurrentModificationExceptionます。)

注意: JNLP テンプレート バリデーターは XML 属性の順序を考慮する

最後に、プロパティの値を入力するプロセスによって JNLP ドキュメント内の他の要素の属性が並べ替えられる可能性がある場合、JNLP テンプレートの検証が失敗する可能性があります。(DOM パーサーで JNLP を解析し、ワイルドカードを入力し、それをストリーミングして戻すことStreamResultが、これが発生する 1 つの方法です。) たとえば、次の 2 つの複数属性要素があり、要素の順序が一致する必要がありました。

<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>
于 2013-12-06T17:46:41.690 に答える