JavaWebStart のバックアップの現在との差分(No.6)
TITLE:Java Web Start
Java Web Start
編集者:Terai Atsuhiro~
作成日:2003-12-11
更新日:2017-11-02 (木) 15:25:55
- title: Java Web Start keywords: [Java, "Web Start", jnlp] description: Java Web Startについてのメモで、jarファイルへの署名方法やjnlpファイルのサンプルなどを紹介しています。 author: aterai pubdate: 2003-12-11
- Java Web Start
- Java Web Start とは
- Java Web Start とは
- security
- security
- JNLP API
- JNLP API
- ローカル・マシンに対する完全アクセス
- ローカル・マシンに対する完全アクセス
- 証明書のインポート
- 証明書のインポート
- 「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- 「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- Web Start のデバッグ
- deployJava.js
- deployJava.js
- 参考リンク
- 参考リンク
- コメント
- コメント
- Java Web Start
- Java Web Start とは
- Java Web Start とは
- security
- security
- JNLP API
- JNLP API
- ローカル・マシンに対する完全アクセス
- ローカル・マシンに対する完全アクセス
- 証明書のインポート
- 証明書のインポート
- 「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- 「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- Web Start のデバッグ
- deployJava.js
- deployJava.js
- 参考リンク
- 参考リンク
- コメント
- コメント
Java Web Start とは
Java Web Start
(Java
アプリケーションの配備を簡素化するテクノロジ)を利用すると、Web
ブラウザで1
回クリックするだけでフル装備のアプリケーションを起動できます。複雑なインストール作業なしで、フル機能のスプレッドシートプログラムやインターネットチャットクライアントなどをダウンロードおよび起動できます。
Java Web Start とは
Java Web Start*1を利用すると、Web ブラウザで1回クリックするだけでフル装備のアプリケーションを起動できます。複雑なインストール作業なしで、フル機能のスプレッドシートプログラムやインターネットチャットクライアントなどをダウンロードおよび起動できます。
Java Web Startより引用
security
デフォルトでは、Java Web Start から起動されるクライアントJavaアプリケーションは、安全な限定的環境で実行されるようになっています。security
デフォルトでは、Java Web Start
から起動されるクライアントJava
アプリケーションは、安全な限定的環境で実行されるようになっています。
その環境の中では、以下のような禁止事項があります。
- ローカル・ファイルへのアクセスは禁止
- 他のコンピューターへのネットワーク接続などが禁止
JNLP API
JNLP API の FileOpenService を使用すると、証明書などを用意しなくても、ユーザがFileChooserで指定したローカルファイルだけを読み書きすることができます。JNLP API
JNLP API
のFileOpenService
を使用すると、証明書などを用意しなくても、ユーザがFileChooser
で指定したローカルファイルだけを読み書きすることができます。
Java Tutorial にある JWSFileChooserDemo などを実行してみてください。
Java Tutorial
にある JWSFileChooserDemo などを実行してみてください。
ローカル・マシンに対する完全アクセス
ローカル・マシンに対する完全アクセスを得る場合は次の2点が必要です。- セキュリティ証明書ですべてのJARファイルに署名する
- JNLPファイルに"all-permissions" を指定する
ローカル・マシンに対する完全アクセス
ローカル・マシンに対する完全アクセスを得る場合は次の2
点が必要です。
以下では、自分で自分自身を証明しているテスト用の証明書(オレオレ証明書)を作って説明します。信頼できるセキュリティ証明書は、ちゃんとした証明書発行機関*2から取得してください。
- 参考:コード署名証明書の購入~利用プロセス
- セキュリティ証明書ですべての
JAR
ファイルに署名する -
JNLP
ファイルにall-permissions
を指定する
デジタル署名
- JARファイルの作成
まず、JARファイルを作ります(Antを使用する場合は、Ant(Jarファイルの作成)など)。 以下では、自分で自分自身を証明しているテスト用の証明書(オレオレ証明書)を作って説明します。信頼できるセキュリティ証明書は、ちゃんとした証明書発行機関(認証局、
CA
)から取得してください。
デジタル署名
-
JAR
ファイルの作成 まず、JAR
ファイルを作ります(Ant
を使用する場合は、Ant(Jarファイルの作成)など)。jar cf Test.jar Test.class
- キーストア(セキュリティ証明書)の作成
- キーストア(セキュリティ証明書)の作成
次に、キーストア(証明書を保持するデータベース)を作ります。
keytool -genkey -keystore myKeyStore -alias myAlias
以下のようなことを聞かれます。C:\TEST\SECURITY>"%JAVA_HOME%\bin\keytool" -genkey -keystore myKeyStore -alias myAlias キーストアのパスワードを入力してください: ********** 姓名を入力してください。 [Unknown]: Terai Atsuhiro 組織単位名を入力してください。 [Unknown]: [Unknown]: 組織名を入力してください。 [Unknown]: Hoge 都市名または地域名を入力してください。 [Unknown]: Meguro 州名または地方名を入力してください。 [Unknown]: Tokyo この単位に該当する 2 文字の国番号を入力してください。 [Unknown]: JP CN=Terai Atsuhiro, OU=Sample Team, O=Hoge, L=Meguro, ST=Tokyo, C=JP でよろしいですか? [no]: yes <myAlias> の鍵パスワードを入力してください。 (キーストアのパスワードと同じ場合は RETURN を押してください): C:\TEST\SECURITY>
- キーストア(セキュリティ証明書)の作成
次に、キーストア(証明書を保持するデータベース)を作ります。
- JARファイルに署名
最後に、JARファイルに署名します。以下はJARファイルに署名するときの、Antターゲットのサンプルです。パスワードを聞かれるので、入力してください。
-
JAR
ファイルに署名 最後に、JAR
ファイルに署名します。以下はJAR
ファイルに署名するときの、Ant
ターゲットのサンプルです。パスワードを聞かれるので、入力してください。
${build.dir}、${signjar.keystore}などの各propertyは、任意の値を設定しておいてください。<target name="sign" depends="init"> <input message="input pass" addproperty="store.pass" /> <signjar keystore="${signjar.keystore}" <!-- myKeyStore --> alias="${signjar.alias}" <!-- myAlias --> storepass="${store.pass}"> <fileset dir="${build.dir}" includes="**/*.jar"/> </signjar> </target>
-
- キーストア(セキュリティ証明書)の作成
jnlpファイル
以下は、セキュリティテスト用のjnlpサンプルです。${build.dir}
、${signjar.keystore}
などの各property
は、任意の値を設定しておいてください。
jnlpファイル
以下は、セキュリティテスト用のjnlp
サンプルです。
<?xml version="1.0" encoding="UTF-8"?>
#spandel
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/data/jws/" href="example.jnlp">
#spanend
#spanadd
<jnlp spec="1.0+" codebase="https://ateraimemo.com/data/jws/" href="example.jnlp">
#spanend
<information>
<title>JWS all-permissions</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/JavaWebStart.html" />
<vendor>Java Swing Tips - aterai@outlook.com</vendor>
<homepage href="https://ateraimemo.com/JavaWebStart.html" />
<description>Swing Example</description>
<description kind="short">example</description>
<offline-allowed />
</information>
<update check="timeout" policy="always" />
<security>
<all-permissions />
</security>
<security>
<all-permissions />
</security>
<resources>
<java version="1.6+" />
<jar href="example.jar" main="true" />
</resources>
<application-desc main-class="example.MainPanel" />
</jnlp>
もし<security><all-permissions/></security>要素が無い場合、ローカルリソースにアクセスするようなアプリケーションは起動できません。jarなどに署名し、<security>要素を指定すれば、起動はできるようになりますが、上記サンプルで作成したのが自己証明書なのでセキュリティ警告ダイアログが出ます。
もし<security><all-permissions/></security>
要素が無い場合、ローカルリソースにアクセスするようなアプリケーションは起動できません。jar
などに署名し、<security>
要素を指定すれば、起動はできるようになりますが、上記サンプルで作成したのが自己証明書なのでセキュリティ警告ダイアログが出ます。
サンプルアプリケーション
- サンプルを Web Start で起動
- example.jar
- src.zip (キーストア(この例ではmyKeyStore)は含まれていません)
サンプルアプリケーション
- サンプルを Web Start で起動
- example.jar
- src.zip (キーストア(この例では
myKeyStore
)は含まれていません)
上記のサンプルを起動すると、以下のようなセキュリティ警告パネルが表示されます。
証明書の詳細をクリックすると以下のような証明書情報が表示されます。 先に述べたように、自分で自分を証明しているだけなので、信頼できない団体から発行されていると警告されています*3。上記のソースをダウンロードするなどして署名の実験をしてみてください。 先に述べたように、自分で自分を証明しているだけなので、信頼できない団体から発行されていると警告されています(開始を押すとJFileChooser
などが使えるようになりますが、自己責任でお願いします)。上記のソースをダウンロードするなどして署名の実験をしてみてください。
証明書のインポート
証明書のインポート
作成したキーストアから証明書をファイルに書き出します。C:\TEST>keytool -export -keystore myKeyStore -alias myAlias -file example.cer キーストアのパスワードを入力してください: ********** 証明書がファイル <example.cer> に保存されました。 C:\TEST\>%JAVA_HOME%\bin\javaws.exe を起動し、「編集→設定→セキュリティ→証明書」で、上記の証明書ファイル example.cer をインポートします。
"%JAVA_HOME%\bin\javaws.exe"
を起動し、「編集→設定→セキュリティ→証明書」で、上記の証明書ファイルexample.cer
をインポートします。「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- default(JumpToClickedPositionSlider): &jnlp2(Swing/JumpToClickedPositionSlider);
- jnlp.packEnabled, jnlp.versionEnabled: &jnlp2(Swing/Pack200);
- http://terai.xrea.jp/swing/pack200/src.zip
- http://terai.xrea.jp/swing/pack200/example__V1.0.2.jar.pack.gz
- 同じJarファイルをPack200で圧縮して(jnlp.packEnabled)、ダウンロードするファイルのサイズを圧縮
- ファイル名にバージョンを付加して(jnlp.versionEnabled)、不必要なアップデートのチェックをしない
「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- https://ateraimemo.com/swing/pack200/src.zip
- https://ateraimemo.com/swing/pack200/example__V1.0.17.jar.pack.gz
- 同じ
JAR
ファイルをPack200
で圧縮して(jnlp.packEnabled
)、ダウンロードするファイルのサイズを圧縮 - ファイル名にバージョンを付加して(
jnlp.versionEnabled
)、不必要なアップデートのチェックをしない
- 参考:
- -
以下、Antで
Pack200Task
を使用する場合のメモ
- Deployment — Java.net
- via: java - How to make an Ant task to sign and pack200 all my JAR files? - Stack Overflow
- https://java-pack200-ant-task.dev.java.net/ が無くなってしまったので、Deployment — Java.netのSubversionリポジトリからソースコードを取得して
deployment-ant-pack200-1.0.jar
を作成し、パスを通す(%ANT_HOME%\lib
以下にコピーするなど)必要がある
mvn package -Dmaven.test.skip=true
<target name="dist" depends="package, dist-libcopy, prepare-web">
<mkdir dir="${bkup.dir}" />
<fileset id="java.file.list" dir="${src.dir}">
<include name="**/*.java" />
</fileset>
<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" />
<pack200 src="${build.dir}/${name}.jar"
destfile="${build.dir}/${name}__V${version}.${build.number}.jar.pack.gz"
gzipoutput="true" />
<filter token="homepage" value="${jnlp.homepage}" />
<filter token="title" value="${jnlp.Name}" />
#spandel
/* 以下省略 */
#spanend
#spanadd
<target name="dist" depends="package, dist-libcopy, prepare-web">
#spanend
<mkdir dir="${bkup.dir}" />
<fileset id="java.file.list" dir="${src.dir}">
<include name="**/*.java" />
</fileset>
<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" />
<pack200 src="${build.dir}/${name}.jar"
destfile="${build.dir}/${name}__V${version}.${build.number}.jar.pack.gz"
gzipoutput="true" />
<filter token="homepage" value="${jnlp.homepage}" />
<filter token="title" value="${jnlp.Name}" />
#spanadd
<!-- 以下省略 -->
#spanend
- 上記のサンプルだとファイルサイズは、三分の一程度に圧縮される
- ファイル名にバージョンを追加し、jnlp.versionEnabled として、バージョンが上がった場合のみダウンロードするようにしても、ファイルサイズが元々小さいせいかあまり差が感じられない
- ファイル名にバージョンを追加し、
jnlp.versionEnabled
として、バージョンが上がった場合のみダウンロードするようにしても、ファイルサイズが元々小さいせいかあまり差が感じられない
<?xml version="1.0" encoding="UTF-8"?>
#spandel
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/swing/pack200/" href="example.jnlp">
#spanend
#spanadd
<jnlp spec="1.0+" codebase="https://ateraimemo.com/swing/pack200/" href="example.jnlp">
#spanend
<information>
<title>JST Pack200 Test</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/JavaWebStart.html" />
<vendor>Java Swing Tips - aterai@outlook.com</vendor>
<homepage href="https://ateraimemo.com/JavaWebStart.html" />
<description>Swing Example</description>
<description kind="short">example</description>
<offline-allowed />
</information>
<update check="background" />
<resources>
<java version="1.6+" />
<jar href="example.jar" main="true" version="1.0.2" />
<property name="jnlp.packEnabled" value="true" />
<property name="jnlp.versionEnabled" value="true"/>
</resources>
<application-desc main-class="example.MainPanel" />
</jnlp>
Web Start のデバッグ
- The 90th percentile: How to debug JWS/JNLP
- The 90th percentile: How to debug JWS/JNLP
set JAVAWS_VM_ARGS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n javaws http://terai.xrea.jp/swing/zoom/example.jnlp
- コラム: Java Web Startのリモートデバッグ - SMG
- Java web startアプリケーションをデバッグする(Java6) - Kazzzの日記
"%JAVA_HOME%\bin\java.exe" "-Xbootclasspath/a:%JAVA_HOME%\jre\lib\javaws.jar;%JAVA_HOME%\jre\lib\deploy.jar" -Djnlpx.home="%JAVA_HOME%\jre\bin" -Djnlp.jvm="%JAVA_HOME%\jre\bin\java.exe" -Djava.security.policy="file:%JAVA_HOME%\lib\security\javaws.policy" -DtrustProxy=true -Xverify:remote -Djnlpx.heapsize=NULL,NULL -Djnlpx.vmargs="-classic -Xdebug -Dnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8918" com.sun.javaws.Main "http://terai.xrea.jp/swing/zoom/example.jnlp"
- JaNeLA - The Java Network Launch Anaylzer
javaws https://ateraimemo.com/swing/zoom/example.jnlp
- コラム: Java Web Startのリモートデバッグ - SMG
- Java web startアプリケーションをデバッグする(Java6) - Kazzzの日記
"%JAVA_HOME%\bin\java.exe" "-Xbootclasspath/a:%JAVA_HOME%\jre\lib\javaws.jar;%JAVA_HOME%\jre\lib\deploy.jar" -Djnlpx.home="%JAVA_HOME%\jre\bin" -Djnlp.jvm="%JAVA_HOME%\jre\bin\java.exe" -Djava.security.policy="file:%JAVA_HOME%\lib\security\javaws.policy" -DtrustProxy=true -Xverify:remote -Djnlpx.heapsize=NULL,NULL -Djnlpx.vmargs="-classic -Xdebug -Dnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8918" com.sun.javaws.Main "https://ateraimemo.com/swing/zoom/example.jnlp"
-
"%JAVA_HOME%\bin\javaws" -verbose example.jnlp
と、verbose
オプションをつけて起動すると、JAVAWS_VM_ARGS
の設定や、上記の内容などがダイアログ表示される
-
- JaNeLA - The Java Network Launch Anaylzer
deployJava.js
- https://www.java.com/js/deployJava.js
- &jnlp3(Swing/Pack200);
deployJava.js
-
&jnlp3(Swing/Pack200);無効化
#spandel
<script src="http://java.com/js/deployJava.js"></script>
#spanend
#spanadd
<!-- https://www.java.com/js/deployJava.js -->
#spanend
#spanadd
<script src="https://java.com/js/deployJava.js"></script>
#spanend
<script>deployJava.createWebStartLaunchButtonEx('$url', '1.6+');</script>
Java7をインストールしてから?、deployJava.jsを使うと、Java のダウンロードページに飛ばされるようになってしまった…。
- OTN Discussion Forums : Problems using deployJava.js with Java 7 ...
- Bug ID: 7111793 deployJava.js installs 1.6 when asked for 1.7 on clean machine
Java7
をインストールしてから?、deployJava.js
を使うと、Java
のダウンロードページに飛ばされるようになってしまった…。 - Java Web Start & JNLP - Problems using deployJava.js with Java 7
- Bug ID: 7111793 deployJava.js installs 1.6 when asked for 1.7 on clean machine
-
7u4
で修正されている(が、また元に戻すのは面倒なのでdeployJava.js
は使用しない…)
-
参考リンク
- Java(TM) Web Start
- Java(TM) Web Start(日本語)
- JDK の開発ツール#セキュリティーツール
- javax.jnlp (JNLP API Reference 1.5)
- Unofficial Java Web Start/JNLP FAQ
参考リンク
- Java(TM) Web Start
- Java(TM) Web Start(日本語)
- JDK の開発ツール#セキュリティーツール
- javax.jnlp (JNLP API Reference 1.5)
- Unofficial Java Web Start/JNLP FAQ
- Deploying - Java Web Start & JNLP
- Javaアプリケーションのテスト用に証明書チェーンを生成
- 無償で正統的なコードサイニング証明書を入手する方法 - 日々是開発:SQS Development(2005-10-03)
- Space: Java Web Start & JNLP | Oracle Forums
- Javaアプリケーションのテスト用に証明書チェーンを生成
- 無償で正統的なコードサイニング証明書を入手する方法 - 日々是開発:SQS Development(2005-10-03)
- Deploying Your Rich Internet Application Nice And Easy!
- Deploying a Java Web Start application using the createWebStartLaunchButton function: The Java Tutorials' Weblog
- Deploying Your Rich Internet Application Nice And Easy! (The Java Tutorials' Weblog)
- Deployment Toolkit 101 (The Java Tutorials' Weblog)
- Avoiding Unnecessary Update Checks (The Java™ Tutorials > Deployment > Deployment In-Depth)
コメント
- メモ: [bug JNLP:JavaWebStartでデスクトップ上に作成したショートカット<アイコンにファイルをドロップすると、そのアプリケーションの起動に失敗し、「このアプリケーションは起動できません」と出る - 日々是開発:SQS Development(2007-12-02)] -- aterai
- メモ:Bug ID: 6943522 Failed to launch any signed application on 6u19 when cache is disabled -- aterai
- リンク切れを修正。 -- aterai
- いつもお世話になっております。単体SWINGでは-Djava.net.preferIPv4Stack=trueを付けると、PGMはうまく動きましたが、jnlpにどのように書けばいいかが判らなく、ご教示ください。<resources><property name="java.net.preferIPv4Stack" value="true"/>はだめみたいです。</resources>。いつもご教示、感謝しております。 -- panda?
- こんばんは。The following properties, as well as properties beginning with either "javaws." or "jnlp.", are considered "secure" and will be passed to the VM in this way:、次のプロパティーは「安全」とみなされ、この方法で VM に渡されます。 …にある安全とみなされるプロパティに、java.net.preferIPv4Stack はないので、<security><all-permissions/></security>として、セキュリティ証明書でjarに署名する必要があるのかもしれません(試していないのでうまくいくか不明ですが)。 -- aterai
- あと、jnlpに記述する必要がないなら、コマンドラインから、javaws -verbose -J-Djava.net.preferIPv4Stack=true http://terai.xrea.jp/swing/wipe/example.jnlp などとしてテストしてみるのもいいかもしれません。 -- aterai
- ご教示、感謝します。方法1は実施しましたが、だめでした。方法2について、まだ理解していません。JWSにおいて、jnlpに書かない方法はありますか?また方法3として、JAVA PGMに直接System.setProperty("java.net.preferIPv4Stack", "true");しましたが、IPv6を取ってきます。方法2について、もう少しご教示ください。 -- panda?
コメント
- メモ: bug JNLP:JavaWebStartでデスクトップ上に作成したショートカット<アイコンにファイルをドロップすると、そのアプリケーションの起動に失敗し、「このアプリケーションは起動できません」と出る - 日々是開発:SQS Development(2007-12-02) -- aterai
- メモ:Bug ID: 6943522 Failed to launch any signed application on 6u19 when cache is disabled -- aterai
- リンク切れを修正。 -- aterai
- いつもお世話になっております。単体SWINGでは-Djava.net.preferIPv4Stack=trueを付けると、PGMはうまく動きましたが、jnlpにどのように書けばいいかが判らなく、ご教示ください。<resources><property name="java.net.preferIPv4Stack" value="true"/>はだめみたいです。</resources>。いつもご教示、感謝しております。 -- panda
- こんばんは。The following properties, as well as properties beginning with either "javaws." or "jnlp.", are considered "secure" and will be passed to the VM in this way:、次のプロパティーは「安全」とみなされ、この方法で VM に渡されます。 …にある安全とみなされるプロパティに、java.net.preferIPv4Stack はないので、<security><all-permissions/></security>として、セキュリティ証明書でjarに署名する必要があるのかもしれません(試していないのでうまくいくか不明ですが)。 -- aterai
- あと、jnlpに記述する必要がないなら、コマンドラインから、javaws -verbose -J-Djava.net.preferIPv4Stack=true https://ateraimemo.com/swing/wipe/example.jnlp などとしてテストしてみるのもいいかもしれません。 -- aterai
- ご教示、感謝します。方法1は実施しましたが、だめでした。方法2について、まだ理解していません。JWSにおいて、jnlpに書かない方法はありますか?また方法3として、JAVA PGMに直接System.setProperty("java.net.preferIPv4Stack", "true");しましたが、IPv6を取ってきます。方法2について、もう少しご教示ください。 -- panda
- 方法1の補足ですが、例えば、C:\Users\%USERNAME%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties ファイルなどに deployment.javaws.secure.properties=java.net.preferIPv4Stack を追加して、<property name="java.net.preferIPv4Stack" value="true"/>を安全であると許可してみるのはどうでしょうか?
- 方法2がうまく動作するのなら、クライアントの環境変数 _JAVA_OPTIONS か、JAVA_TOOL_OPTIONS に、-Djava.net.preferIPv4Stack=true を追加するといいかもしれません。 -- aterai
- 方法2がうまく動作するのなら、クライアントの環境変数 _JAVA_OPTIONS か、JAVA_TOOL_OPTIONS に、-Djava.net.preferIPv4Stack=true を追加するといいかもしれません。 -- aterai
- メモ: Java Web Startの脆弱性(CVE-2012-0500)を調べてみる - 思い立ったら書く日記 -- aterai