プロジェクト

全般

プロフィール

Java Web Start

概要

アプリケーション(JARファイル)をWebサーバー上に配置し、設定ファイル(JNLPファイル)をWebブラウザで読み込みアプリケーションをダウンロードして実行する仕組みです。

サンドボックス

アプリケーションを実行する環境をサンドボックス内に限定するかどうかを制御することができます。
サンドボックス内で実行するアプリケーションは、サンドボックス内のディスクアクセス、JNLPファイルで規定のJARファイル内のリソースへのアクセス、アプリケーションのコードベースとなるサーバーへのネットワークアクセスが許されています。

サンドボックスの制限を超える

サンドボックスの制限を緩和する手段も用意されています。JNLP APIを用いてユーザーの承認を得ることで制限を超えることができます。

サンドボックス外で実行する

次の条件を満たすことで、サンドボックス外で実行することができます。

  • アプリケーションのJARファイルすべてに電子署名を施す
  • JARのマニフェストファイルにPermissions属性を記述する
    Permissions: all-permissions
    
  • JNLPファイルにセキュリティ定義を記述する
    <security>
      <all-permissions />
    </security>
    

電子署名(コードサイニング)

アプリケーションには、正規の認証局(Webブラウザに組み込まれている認証局)で認証することが可能な電子署名を行います。電子署名がないアプリケーションはデフォルトでは実行することができません。また、正規の認証局以外の認証局による電子署名では、同じく実行することができません。

例外サイト・リスト

電子署名のないアプリケーション、または正規の認証局で認証されない電子署名をされたアプリケーションを実行する方法が用意されています。
JREの例外サイト・リストに登録されたサーバーからダウンロードしたアプリケーションは、正規の認証局で認証可能な電子署名がなくても実行することができます。

  • JNLPファイルにcodebaseを明示的に記述していない場合、例外サイト・リストに登録されたサーバーからダウンロードしてもアプリケーションを実行することができませんでした(Java SE 8u121)。

開始

シナリオ1 単体で実行可能なJARファイル

NetBeans IDE 8.2でJavaFXアプリケーションを作成すると、デフォルトでJava Web Start用のJNLPファイル、HTMLファイル群が生成されます。
JavaFXアプリケーションのJARファイルとJNLPファイルをWebサーバーに配置します。今回はHTMLファイル群は使用しません。

WebブラウザからJNLPファイルを直接参照します。

Webサーバーの設定

Webサーバー側では、JNLPファイルのMIME設定が必要です。CentOS 6.8の標準搭載WebサーバーであるApache 2.2では、既に設定が折込済みでした。

  • /etc/mime.types
    application/x-java-archive                      jar
    application/x-java-jnlp-file                    jnlp
    

JNLPファイルの修正

NetBeansがデフォルトで生成するJNLPファイルにはcodebase属性が未設定(HTMLファイルからJavaScriptでcodebaseを与える模様)なので、サーバーに配置後codebaseを追記します。

- <jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="Calendar.jnlp">
+ <jnlp codebase="http://www.torutk.com:8086/app/calendar/" spec="1.0" xmlns:jfx="http://javafx.com" href="Calendar.jnlp">
codebaseが未設定の場合

次のエラーが発生しました。

jnlp_launch-3.png

詳細の内容は次です。

ExitException[ 3]com.sun.deploy.net.FailedDownloadException: リソースfile:/C:/Users/***/AppData/Local/Temp/Calendar.jarをロードできません
    at sun.plugin2.applet.JNLP2Manager.downloadResources(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

クライアント側の設定(最新でないJREを使用)

クライアントにインストールされているJava実行環境(JRE)が最新に更新されていない場合、次の警告ダイアログが表示されます。
(例:最新のJREがJava SE 8u121 ですが、クライアントマシンにはJava SE 8u112が入っている場合)

「後で」を選べば一応次に進めます。

jnlp_launch-2.png

次のセキュリティチェックで最新のJREでない場合、Java Web Startのアプリケーションを実行できません。

jnlp_launch-3.png

クライアント側の設定(最新のJREを使用)

クライアント側のセキュリティ確保のため、アプリケーションに電子署名をするか、例外サイトリストに登録が必要です。

jnlp_launch-4.png

クライアント側の設定(例外サイト・リストに登録)

電子署名はせずに、例外サイト・リストに、ダウンロードするWebサーバーのURLを登録してみます。
Windows の場合、コントロールパネルのJavaを起動します。[セキュリティ]タブを選択します。

controlpanel_java-1.png

[サイト・リストの編集]ボタンをクリックし、[追加]ボタンをクリックします。

controlpanel_java-2.png

JNLPファイル・JARファイルを置いたディレクトリは、app/calendar/ ですが、サイト・リストには app/ までを記述してみました。
上位のディレクトリを指定しても大丈夫でした。

登録した場合、次の警告画面が出て実行可能となります。

jnlp_launch-5.png

なお、ローカルのリソースをアクセスしようとするとセキュリティエラーが発生します。次の画面が表示されます。

起動時のセキュリティ検査で実行時エラー発生

クリックすると詳細が表示されます。
今回は、ローカルファイルシステムのファイルを読み込みしようとしてエラーとなった場合です。

jnlp_launch-7.png

クライアント側の設定(アプリケーションに署名)

例外サイト・リストの設定を削除し、アプリケーションに署名をしてみます。
NetBeans のプロジェクト設定で、[ビルド] > [デプロイメント] > [無制限のアクセスをリクエスト(署名有効化)]にチェックを付けます。

netbeans_deployment-1.png

ビルド後、JNLPファイルとJARファイルをWebサーバーに配置します。JNLPファイルにはcodebaseを追記するのを忘れないようにします。
(NetBeansが生成するHTMLファイル群は使用しない場合)

  • 署名有効化してビルドするとJNLPファイルにセキュリティ定義が追加されました。
    <security>
      <all-permissions/>
    </security>
    

実行したところ、実行がブロックされてしまいました。

jnlp_launch-8.png

どうやら、自己署名付きアプリケーションでは実行が許可されない模様です。

開発環境

NetBeans IDE

セキュリティ設定の切り替え(sandboxとall-permissions)

JavaFXアプリケーションのプロジェクト設定で、切替可能です。

プロジェクトを右クリックし、コンテキストメニューの [プロパティ] > [ビルド] > [デプロイメント]を選択し、[無制限のアクセスをリクエスト(署名有効化)]のチェックを付ける/外すで切替えます。

  • チェックを外した場合(デフォルト:sandbox)
    Permissions: sandbox
    Codebase: *
    
  • チェックを付けたた場合(all-permissions)
    • JARのマニフェストファイル
      Permissions: all-permissions
      Codebase: *
      
    • JNLPファイル
      <security>
        <all-permissions/>
      </security>
      

クリップボードから画像を追加 (サイズの上限: 1 GB)