j7u45へのアップグレード時のJava Web Startの問題

タイトルから推測できるように、この投稿はJavaによってリリースされたセキュリティ更新に専念します。これにより、おそらくWebスタートアプリケーションの起動が中断/中断されます。 すべてが無関心ではない-私は猫を求めます。



当社では、新しいバージョンがリリースされるとすぐに、すべてのサーバーでJavaを更新する方法を採用しています。 実際、これが今回の作業です。 しかし、何かがおかしくなり、Webスタートクライアントの実行が停止し、戦争を宣言せずにアプリケーションが終了し始めました。

彼女の袖をまくり上げて、私はこの振る舞いの原因を理解しなければなりませんでした。



クライアントをローカルで起動すると、マニフェストファイルに次のプロパティがないという以前は知られていない警告が表示されました:Permissions、Application-Name、Codebase。 テストとして、それらについて少し読んだ後、それらをすべてのマニフェストのバカに追加することが決定されました。



Permissions: all-permissions Application-Name: AppName Codebase: *
      
      







あまり美しくありませんが、警告を取り除きましたが、問題は解決しませんでした。

さらに、長いデバッグ中(幸せな子供時代のEclipse RCPに感謝します)、システムパラメーターが何らかの形で誤って転送され、stackoverflowの次の投稿につながることに気づきました: stackoverflow.com/questions/19400725/with-java-update- 7-45-the-system-properties-no-more-set-from-jnlp-tag-property

それを要約すると、今ではそれを取り込んでJNLPファイルに転送することはできません。



3つのソリューションが見つかりました。

1)JNLPファイルに署名します-docs.oracle.com/javase/7/docs/technotes/guides/jweb/signedJNLP.html#signedJnlp-要するに-jnlpをAPPLICATION.JNLPという名前のJNLP-INFフォルダーの署名済みjarikに入れるだけです幸せ。

このメソッドの主な問題は、クライアントごとに異なるJNLPがあり、一般的にはその場で生成されることです。



2)署名付きJNLPファイルテンプレートを作成します-blogs.oracle.com/thejavatutorials/entry/signing_jar_files_with_a

最初は、このメソッドに決着しました。複雑なことはありません。前の段落と同じで、ファイル名APPLICATION_TEMPLATE.JNLPと変更可能な場所のみが「*」に置き換えられます。

しかし、すべてがそれほどバラ色ではなく、何も機能しませんでした。 テンプレートとjnlpファイルがどのように比較されているかを確認するために、少し恥ずかしがり、Webスタートの内部に入る必要がありました。 その結果、com.sun.javaws.jnl.XMLFormatで次のコードが発見されました。



  public static boolean isBlacklisted(XMLNode paramXMLNode) { if (paramXMLNode == null) { return false; } if (paramXMLNode.getName() != null) { XMLAttribute localXMLAttribute; String str; if ((paramXMLNode.getName().equals("java")) || (paramXMLNode.getName().equals("j2se"))) { for (localXMLAttribute = paramXMLNode.getAttributes(); localXMLAttribute != null; localXMLAttribute = localXMLAttribute.getNext()) { if (localXMLAttribute.getName().equals("java-vm-args")) { str = localXMLAttribute.getValue(); if ((str != null) && (str.indexOf("*") >= 0)) { Trace.println("Blacklisted - a = " + localXMLAttribute, TraceLevel.SECURITY); return true; } } } } else if (paramXMLNode.getName().equals("property")) { for (localXMLAttribute = paramXMLNode.getAttributes(); localXMLAttribute != null; localXMLAttribute = localXMLAttribute.getNext()) { str = localXMLAttribute.getValue(); if ((str != null) && (str.indexOf("*") >= 0)) { Trace.println("Blacklisted - a = " + localXMLAttribute, TraceLevel.SECURITY); return true; } } } } if (isBlacklisted(paramXMLNode.getNested())) { return true; } return isBlacklisted(paramXMLNode.getNext()); }
      
      







次のようなチェックを行います。テンプレートをファイルと比較するとき、現在のタグがブラックリストにあるかどうかを確認します。ブラックリストにある場合は、そのようなjnlpファイルをスキップしません。 現在の実装では、javaタグまたはj2seタグのjava-vm-argsプロパティにテンプレートを追加することはできません。また、値にテンプレートを含むパラメーターを渡すことはできません。



繰り返しになりますが、各クライアントの多くのプロパティは一意であり、フォームのパラメーターを介して送信されます。

 <property name="client.specific.property" value="client.specific.value"/>
      
      







そして、テンプレートに書くことはできません。

 <property name="client.specific.property" value="*"/>
      
      







最後の(その時点での)オプションのみが残ります。



3) bugs.openjdk.java.net/browse/JDK-8023821によると、プロパティにプレフィックス 'jnlp'を追加することでプロパティを転送できます。システムプロパティに正常に転送され、コード内でそれらの場所に移動できます。 。 他の選択肢が見つからなかったため、 ここで見つかったコードはアプリケーションの起動の最初に追加されました。



  private static void initializeSystemProperiesFromJnlp() { //Hack for not signing JNLP file Properties properties = System.getProperties(); // copy properties to avoid ConcurrentModificationException Properties copiedProperties = new Properties(); copiedProperties.putAll(properties); Set<Object> keys = copiedProperties.keySet(); for (Object key : keys) { if (key instanceof String) { String keyString = (String) key; if (keyString.startsWith("jnlp.")) { //$NON-NLS-1$ // re set all properties starting with the jnlp-prefix // and set them without the prefix String property = System.getProperty(keyString); String replacedKeyString = keyString.replaceFirst("jnlp.", ""); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty(replacedKeyString, property); } } } }
      
      







この操作の後、すべてが機能しました。

上記のコードは適切な実践ルールではないことに注意してください。少なくとも、ガジェットにある値を確認する価値はあります。



さらに、別の、より厄介な、しかし正しい方法があります。これは後で学びました。 ここで説明します



この投稿が誰かに役立つことを願っています。



All Articles