torutkのブログ

ソフトウェア・エンジニアのブログ

Java Web Startを久々に使ってみた

NetBeans IDEJavaFXアプリケーションを作成すると、実行可能JARファイルの他に、JNLPファイルとHTMLファイル群が生成されます。いつもは実行可能JARファイルだけを取り出していますが、今回はJava Web Startでアプリケーションを実行できるかを試みてみました。

NetBeans IDEJavaFXアプリケーションで生成されるファイル

まず、JavaFXアプリケーションで生成されるファイルは次となります。

プロジェクト基点ディレクトリ
  +-- dist
        +-- AnalogClockSvg.jar
        +-- AnalogClock.jnlp
        +-- AnalogClock.html
        +-- web-files
              +-- dtjava.js
              +-- *.png, *.gif
  • dtjava.js は、2000行強のJavaScriptで、いろいろ環境の検査(バージョンチェック)をしてくれますが、複雑です。

Webサーバーにdist以下を丸ごと配置

CentOS 6.8 の Apache Webサーバー(httpd)は、デフォルトでJava Web Startに必要なMIME設定がされていたので、ドキュメントルートの下にディレクトリを設けてdist以下を丸ごと配置しました。

次に、dist下のHTMLファイルのURLをWebブラウザWindows 10上でFirefox 64bit版を使用)で開きました。

ですが、このページのリンク(click to launch this app as webstart)をクリックすると、「To view the content on this page, please click here to install JavaFX.」のWebページ内ダイアログが表示されてしまいました。このダイアログの[OK]を押すと、JavaJRE)のダウンロードページへ誘導されてしまいます。

NetBeans が生成したHTMLファイル(とそこで利用されるJavaスクリプトファイル)は、いろいろバージョンチェックをしていおり、Javaプラグインがインストールされていない(Firefox 64bit版はNPAPIプラグインを非サポートのため、Javaプラグインが動作しない)ことを検知して、ダウンロードページへ誘導したものと思われます。

EdgeでHTMLファイルのURLを開くと次の画面となります。

リンクをクリックすると次の画面が表示されます。NetBeansが生成したdtjava.jsファイルには、firefox, chrome, IE, opera, webkitの識別はありましたが、Edgeの識別は見当たりません。そのため、先のFirefoxのようなダウンロードページへの誘導はなかったのかと思われます。

[はい]で進むと、Java Web Startの実行に移りますが、セキュリティで実行がブロックされてしまいます。

これは、Java実行環境(JRE)のセキュリティ仕様通りです。Java SE 7u51以降、Java Web Startアプリケーションを実行するための条件は次となっています。

  • アプリケーション(JARファイル)に、信頼できる認証局の証明書で電子署名されている
  • 最新版のJava(最新のCritical Patch Update版)で実行されている

Oracleの説明ページ

Javaからセキュリティ・プロンプトが表示される場合はどうすればよいですか。

信頼できる認証局の証明書で電子署名するサービスと価格の情報が掲載されているWebページがありました。

コードサイニング証明書を買う前に (山崎はるかのメモ)

個人ではなかなかに敷居が高いですね。安いところでも年間数万円の費用となります。

個人レベルでの実験等で、信頼できる認証局電子署名がない場合は、例外サイト・リストの設定をしてJava Web Startの実行ができるようにする暫定処置があります。以降に記述します。

JNLPファイルのみ利用

HTMLファイル(とそこから呼ばれるJavaScriptファイル)は使用せずに、JNLPファイルとJARファイルだけを使います。ブラウザからはJNLPファイルのURLを直接叩きます。

NetBeans IDEの生成したJNLPファイルには、codebase属性が未記載のためか、JNLPファイルと同じ場所にあるJARファイルのダウンロードが失敗します。そこで、手でcodebase属性を追記します。

- <jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="AnalogClock.jnlp">
+ <jnlp codebase="http://www.torutk.com:8086/app/analogclock/" spec="1.0" xmlns:jfx="http://javafx.com" href="AnalogClock.jnlp">

信頼できる認証局電子署名がない場合の回避策(例外サイト・リスト)

信頼できる認証局電子署名がないと、Java Wet Startの実行がブロックされてしまいますが、回避策が提供されています。
クライアント側のJava実行環境(JRE)に、例外サイト・リストとしてJNLPとJARをダウンロードするサーバーを登録しておくことで、そのサーバーからダウンロードして実行するJavaアプリケーションは電子署名がなくても実行可能となります。

Windows 10の場合、コントロールパネル > プログラム > Java で「Javaコントロール・パネル」を実行し、[セキュリティ]タブ > サイト・リストの編集 からサーバーのURLを登録します*1

実行ボタンを押すと、アプリケーションが実行されます。

デフォルトではsandboxで実行されます。
JavaFXアプリケーションをSandboxで実行すると、背景が透明化されません。うーむ?

JARファイルに自己署名をして、JNLPにall-permissionsを追加して実行すると、背景が透明化されました((NetBeans IDEでは、プロジェクトのプロパティからビルド→デプロイメントで「無制限のアクセスをリクエスト(署名有効化」にチェックを付けると、ビルド時にJARファイルへ電子署名(自己署名)とJNLPファイルのsecurityタグを追加してくれます。)。
背景の透明化には、ローカルリソースの操作が発生しているようです。

all-permissionsを指定した場合の実行時のダイアログは次になります。

JNLPファイルにall-permissiosを指定し、JARファイルに電子署名がないと、起動時に例外が発生してしまいます。

*1:サーバーのホスト名まで記載すればその下のディレクトリすべてが例外サイトとしいて扱われますが、ポート番号がデフォルト以外の場合はポート番号まで記述します。