Java Web Start
Total: 60322
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
Java Web Start とは
Java Web Start
(Java
アプリケーションの配備を簡素化するテクノロジ)を利用すると、Web
ブラウザで1
回クリックするだけでフル装備のアプリケーションを起動できます。複雑なインストール作業なしで、フル機能のスプレッドシートプログラムやインターネットチャットクライアントなどをダウンロードおよび起動できます。
security
デフォルトでは、Java Web Start
から起動されるクライアントJava
アプリケーションは、安全な限定的環境で実行されるようになっています。
その環境の中では、以下のような禁止事項があります。
- ローカル・ファイルへのアクセスは禁止
- 他のコンピューターへのネットワーク接続などが禁止
JNLP API
JNLP API
のFileOpenService
を使用すると、証明書などを用意しなくても、ユーザがFileChooser
で指定したローカルファイルだけを読み書きすることができます。
Java Tutorial
にある JWSFileChooserDemo などを実行してみてください。
ローカル・マシンに対する完全アクセス
ローカル・マシンに対する完全アクセスを得る場合は次の2
点が必要です。
- セキュリティ証明書ですべての
JAR
ファイルに署名する JNLP
ファイルにall-permissions
を指定する
以下では、自分で自分自身を証明しているテスト用の証明書(オレオレ証明書)を作って説明します。信頼できるセキュリティ証明書は、ちゃんとした証明書発行機関(認証局、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]: 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="https://ateraimemo.com/data/jws/" href="example.jnlp">
<information>
<title>JWS all-permissions</title>
<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>
<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
)は含まれていません)
上記のサンプルを起動すると、以下のようなセキュリティ警告パネルが表示されます。
証明書の詳細をクリックすると以下のような証明書情報が表示されます。
先に述べたように、自分で自分を証明しているだけなので、信頼できない団体から発行されていると警告されています(開始を押すとJFileChooser
などが使えるようになりますが、自己責任でお願いします)。上記のソースをダウンロードするなどして署名の実験をしてみてください。
証明書のインポート
作成したキーストアから証明書をファイルに書き出します。
C:\TEST>keytool -export -keystore myKeyStore -alias myAlias -file example.cer キーストアのパスワードを入力してください: ********** 証明書がファイル <example.cer> に保存されました。 C:\TEST\>
"%JAVA_HOME%\bin\javaws.exe"
を起動し、「編集→設定→セキュリティ→証明書」で、上記の証明書ファイルexample.cer
をインポートします。"alias"とパスワードを聞かれるので、これを入力し、最初から実行すれば、セキュリティ警告が以下のように変わっていることが確認できます。これで、先のサンプルのような署名をしたアプリケーションが確認なしで実行できるようになります。
http:// ateraimemo.com/data/jws/security2.png
「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}" />
<!-- 以下省略 -->
- 上記のサンプルだとファイルサイズは、三分の一程度に圧縮される
- ファイル名にバージョンを追加し、
jnlp.versionEnabled
として、バージョンが上がった場合のみダウンロードするようにしても、ファイルサイズが元々小さいせいかあまり差が感じられない
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="https://ateraimemo.com/swing/pack200/" href="example.jnlp">
<information>
<title>JST Pack200 Test</title>
<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
set JAVAWS_VM_ARGS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n 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
&jnlp3(Swing/Pack200);無効化
<!-- https://www.java.com/js/deployJava.js -->
<script src="https://java.com/js/deployJava.js"></script>
<script>deployJava.createWebStartLaunchButtonEx('$url', '1.6+');</script>
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
- Space: Java Web Start & JNLP | Oracle Forums
- Javaアプリケーションのテスト用に証明書チェーンを生成
- 無償で正統的なコードサイニング証明書を入手する方法 - 日々是開発:SQS Development(2005-10-03)
- 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)