JavaWebStart のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- JavaWebStart へ行く。
- 1 (2011-12-05 (月) 17:09:30)
- 2 (2011-12-06 (火) 09:10:19)
- 3 (2011-12-06 (火) 16:07:29)
- 4 (2011-12-06 (火) 17:38:52)
- 5 (2012-02-16 (木) 14:40:05)
- 6 (2012-03-01 (木) 16:37:48)
- 7 (2012-03-06 (火) 14:28:28)
- 8 (2012-03-09 (金) 14:23:11)
- 9 (2012-07-02 (月) 19:49:52)
- 10 (2012-07-08 (日) 20:32:25)
- 11 (2012-08-21 (火) 15:02:40)
- 12 (2012-11-23 (金) 04:36:33)
- 13 (2013-03-13 (水) 14:25:35)
- 14 (2013-07-25 (木) 16:33:58)
- 15 (2013-09-06 (金) 11:33:03)
- 16 (2013-09-18 (水) 21:01:12)
- 17 (2013-11-06 (水) 18:21:23)
- 18 (2014-09-04 (木) 05:29:16)
- 19 (2014-09-05 (金) 21:14:56)
- 20 (2014-09-06 (土) 02:08:04)
- 21 (2014-11-01 (土) 00:46:09)
- 22 (2014-11-08 (土) 01:41:12)
- 23 (2014-11-10 (月) 15:30:08)
- 24 (2014-11-25 (火) 03:03:31)
- 25 (2016-06-15 (水) 16:53:32)
- 26 (2017-04-04 (火) 14:17:08)
- 27 (2017-04-07 (金) 13:51:51)
- 28 (2017-10-27 (金) 16:26:13)
- 29 (2017-11-02 (木) 15:25:54)
- 30 (2017-11-02 (木) 15:34:40)
- 31 (2018-02-27 (火) 14:35:27)
- 32 (2022-08-20 (土) 22:15:25)
TITLE:Java Web Start
Java Web Start
編集者:Terai Atsuhiro
作成日:2003-12-11
更新日:2017-11-02 (木) 15:25:55
Java Web Start とは
Java Web Start*1を利用すると、Web ブラウザで1回クリックするだけでフル装備のアプリケーションを起動できます。複雑なインストール作業なしで、フル機能のスプレッドシートプログラムやインターネットチャットクライアントなどをダウンロードおよび起動できます。
security
デフォルトでは、Java Web Start から起動されるクライアントJavaアプリケーションは、安全な限定的環境で実行されるようになっています。 その環境の中では、以下のような禁止事項があります。
- ローカル・ファイルへのアクセスは禁止
- 他のコンピューターへのネットワーク接続などが禁止
JNLP API
JNLP API の FileOpenService を使用すると、証明書などを用意しなくても、ユーザがFileChooserで指定したローカルファイルだけを読み書きすることができます。
Java Tutorial にある JWSFileChooserDemo などを実行してみてください。
ローカル・マシンに対する完全アクセス
ローカル・マシンに対する完全アクセスを得る場合は次の2点が必要です。
- セキュリティ証明書ですべてのJARファイルに署名する
- JNLPファイルに"all-permissions" を指定する
以下では、自分で自分自身を証明しているテスト用の証明書(オレオレ証明書)を作って説明します。信頼できるセキュリティ証明書は、ちゃんとした証明書発行機関*2から取得してください。
デジタル署名
- 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]: 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ターゲットのサンプルです。パスワードを聞かれるので、入力してください。
<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>
${build.dir}、${signjar.keystore}などの各propertyは、任意の値を設定しておいてください。
jnlpファイル
以下は、セキュリティテスト用のjnlpサンプルです。
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/data/jws/" href="example.jnlp">
<information>
<title>JWS all-permissions</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/JavaWebStart.html" />
<description>Swing Example</description>
<description kind="short">example</description>
<offline-allowed />
</information>
<update check="timeout" policy="always" />
<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>要素を指定すれば、起動はできるようになりますが、上記サンプルで作成したのが自己証明書なのでセキュリティ警告ダイアログが出ます。
サンプルアプリケーション
- サンプルを Web Start で起動
- example.jar
- src.zip (キーストア(この例ではmyKeyStore)は含まれていません)
上記のサンプルを起動すると、以下のようなセキュリティ警告パネルが表示されます。
証明書の詳細をクリックすると以下のような証明書情報が表示されます。
先に述べたように、自分で自分を証明しているだけなので、信頼できない団体から発行されていると警告されています*3。上記のソースをダウンロードするなどして署名の実験をしてみてください。
証明書のインポート
作成したキーストアから証明書をファイルに書き出します。
C:\TEST>keytool -export -keystore myKeyStore -alias myAlias -file example.cer キーストアのパスワードを入力してください: ********** 証明書がファイル <example.cer> に保存されました。 C:\TEST\>
%JAVA_HOME%\bin\javaws.exe を起動し、「編集→設定→セキュリティ→証明書」で、上記の証明書ファイル example.cer をインポートします。"alias"とパスワードを聞かれるので、これを入力し、最初から実行すれば、セキュリティ警告が以下のように変わっていることが確認できます。これで、先のサンプルのような署名をしたアプリケーションが確認なしで実行できるようになります。
http:// terai.xrea.jp/data/jws/security2.png
「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)、不必要なアップデートのチェックをしない
<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}" />
/* 以下省略 */
- 上記のサンプルだとファイルサイズは、三分の一程度に圧縮される
- ファイル名にバージョンを追加し、jnlp.versionEnabled として、バージョンが上がった場合のみダウンロードするようにしても、ファイルサイズが元々小さいせいかあまり差が感じられない
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/swing/pack200/" href="example.jnlp">
<information>
<title>JST Pack200 Test</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/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
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
deployJava.js
- https://www.java.com/js/deployJava.js
- &jnlp3(Swing/Pack200);
<script src="http://java.com/js/deployJava.js"></script>
<script>deployJava.createWebStartLaunchButtonEx('$url', '1.6+');</script>
Java7をインストールしてから?、deployJava.jsを使うと、Java のダウンロードページに飛ばされるようになってしまった…。
参考リンク
- 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アプリケーションのテスト用に証明書チェーンを生成
- [dev 無償で正統的なコードサイニング証明書を入手する方法 - 日々是開発: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
コメント
- メモ: [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?
- 方法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