このセクションでは、次のトピックについて説明します。
Java Web Startでデプロイ可能なアプリケーションを開発する方法は、Java Platform, Standard Edition向けのスタンドアロン・アプリケーションを開発する方法と、基本的には同じです。 たとえば、アプリケーションのエントリ・ポイントは標準のpublic static void main(String[] argv)
です。
ただし、webデプロイメントをサポートするには - アプリケーションの自動ダウンロードおよび起動 - また、アプリケーションをセキュアなサンドボックスで実行できるようにするために、次のような追加の考慮事項があります:
アプリケーションは、署名されたJARファイルのセットとして配信する必要があります。 各JARファイル内のすべてのエントリに署名する必要がある。
ファイルやイメージなどのすべてのアプリケーション・リソースは、JARファイルに格納する必要があります。 リソースは、Java Platform, Standard EditionのgetResource
メカニズムを使用して参照する必要があります。
安全なサンドボックス内で実行されるように記述されたアプリケーションには、次の制限が適用される。
ローカル・ディスクにアクセスできない。
すべてのJARファイルを同一ホストからダウンロードする必要がある。
ユーザー・プロンプトを使用しないネットワーク接続は、JARファイルのダウンロード元のホストに対してのみ有効になる。 他のホストへの接続には、ユーザーの承認が必要です。
セキュリティ・マネージャはインストールできない。
ネイティブ・ライブラリは使用できない。
システム・プロパティへのアクセスが制限される。 アプリケーションは、JNLPファイル内に定義されたすべてのセキュア・システム・プロパティに対する読取り/書込みアクセス権を持つほか、アプレットからアクセス可能なプロパティ・セットに対する読取り専用アクセス権を持つ。
これらの制限のいくつかは、JNLP APIを使用してファイル・システムやその他のシステム・リソースにアクセスすることで解決できます。
アプリケーションでは、System.exit
コールを使用できます。
Java Web StartによってWebサーバーからクライアント・マシンに転送されるのは、JARファイルだけです。 また、JARファイルをローカル・マシン上のどこに格納するかも判断されます。 したがって、イメージや設定ファイルといったリソースへのディスク相対参照を、アプリケーション内で使用することはできません。
すべてのアプリケーション・リソースは、JNLPファイルのresourcesセクションに指定されたJARファイルから取得するか、WebサーバーへのHTTP要求を通じて明示的に取得する必要があります。 JARファイル内にリソースを格納することをお薦めします。というのも、それらのリソースは、Java Web Startによってローカル・マシン上にキャッシュされるからです。
次のコード例は、JARファイルからイメージを取り出す方法を示したものです。
// Get current classloader ClassLoader cl = this.getClass().getClassLoader(); // Create icons Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif")); Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif")); ...
この例では、アプリケーションのJARファイルのいずれかに、次のエントリが存在することを前提にしています。
images/save.gif images/cut.gif
JNLP APIを使用して、クライアントのファイル・システムなどのリソースにアクセスできます。 JNLPI APIを使用してクライアントにアクセスする方法の詳細については、次のトピックを参照してください。
Java Web Startは、次のセキュリティ上の問題に対応しています。
Java Web Startで起動されたアプリケーションはデフォルトで、制限された環境内で実行されます。このため、記憶装置やローカル・ネットワークなど、ローカルのコンピューティング・リソースへのアクセスが制限されます。
Java Web Startがサポートするもう1つのセキュリティ機能は、デジタル・コード署名です。 起動対象のアプリケーションが1つ以上の署名付きJARファイルとして配信された場合、Java Web Startは、それらのJARファイルの内容が署名後に変更されていないかどうか検証します。 デジタル署名の検証に失敗した場合、そのアプリケーションは第三者によって改ざんされた可能性があるため、Java Web Startはアプリケーションの実行を中止します。
コード署名のサポートは、ユーザーとアプリケーション・サービス・プロバイダの双方にとって重要です。 このサービスを使えば、ユーザーは、アプリケーションの提供元が信頼できるかどうかを検証できます。 また、ユーザーによって信頼された署名付きのアプリケーションは、ローカル・ディスクへのアクセスなど、追加のシステム権限を要求することもできます。
Java Web Startは、アプリケーションを起動する前に、署名者の証明書に基づいて、アプリケーションの提供元を示すダイアログ・ボックスを表示します。 これにより、ユーザーは、ダウンロードしたコードに追加の特権を付与するかどうかについて情報に基づいた決定を下すことができます。
JNLPファイルに次の設定を含めることにより、アプリケーションはすべてのJARファイルが署名されている場合、クライアント・システムへのフル・アクセスをリクエストできます:
<security> <all-permissions/> </security>
Java Web Startでのコード署名の実装は、Java Platform Standard EditionのセキュリティAPIに基づいています。
開発者は、Javaアプレットと同じ方法でJava Web Startで使用するコードに署名 - Java Platform, Standard Editionの標準jarsigner
ツールを使用します。 jarsignerツールのマニュアルでは、コードの署名方法とテスト証明書の作成方法の具体例を示すとともに、署名に関するその他の問題について説明しています。
テストの目的で、自己署名証明書を使用してJARファイルに署名することができます。 プロダクションでは、信頼できる認証局によって発行されたコード署名証明書を使用します。
次に、自己署名テスト証明書を使用してJARファイルに署名するステップを示します。
keytool
およびjarsigner
ツールのロケーションがパスにあることを確認します。 これらのツールは、JDK binディレクトリにあります。
新しいkeystore
内に新しいキーを作成します。次のようにします。
keytool -genkey -keystore myKeystore -alias myself
パスワードや名前など、新しいキーに関する情報の入力を求められます。 これにより、ディスクにmyKeystore
ファイルが作成されます。
次のように自己署名テスト証明書を作成します:
keytool -selfcert -alias myself -keystore myKeystore
これによって、パスワードの入力を求められます。 証明書の生成には数分かかります。
すべてが正常であることを確認します。 キーストアの内容を一覧表示するには、次のコマンドを使用します。
keytool -list -keystore myKeystore
出力は次のようになります。
Keystore type: jks Keystore provider: SUN Your keystore contains 1 entry: myself, Tue Jan 23 19:29:32 PST 2001, keyEntry, Certificate fingerprint (MD5): C2:E9:BF:F9:D3:DF:4C:8F:3C:5F:22:9E:AF:0B:42:9D
次のようにテスト証明書を使用してJARファイルに署名します:
jarsigner -keystore myKeystore test.jar myself
このステップを、すべてのJARファイルに対して繰り返します。
自己署名テスト証明書はあくまでも内部テスト専用であることに注意してください。この証明書はユーザーの身元を保証できず、信頼性に欠けるためです。 アプリケーションを本番環境に移す際には、VeriSignやThawteなどの認証局から信頼できる証明書を取得し、それを使用するようにしてください。
自己署名テスト証明書を使用して署名されたアプリケーションを実行するには、アプリケーションを実行するコンピュータで次のいずれかを実行します。
Javaコントロール・パネルから管理されている例外サイト・リストにアプリケーションのロケーションを追加します。
keytool
ユーティリティを使用して、Javaコントロール・パネルを使用してテスト証明書をユーザー署名者CAストアにインポートするか、システム署名者CAストアにインポートします。
JNLPファイルをJava Platform、Standard Editionでサポートされている任意の文字エンコーディングでエンコードします。 サポートされているエンコーディングのリストは、「サポートされるコード」を参照してください。
JNLPファイルをエンコードするには、そのファイルのXML prologでエンコーディングを指定します。 たとえば、次の行は、JNLPファイルをUTF-16でエンコードすることを示しています。
<?xml version="1.0" encoding="utf-16"?>
XML prologそのものは、UTF-8でエンコードする必要があります。
Java Web Startでは、ブラウザと同様の方法で証明書が動的にインポートされます。 これを実現するために、Java Web Startは、java.protocol.handler.pkgs
システム・プロパティを使用して独自のHTTPSハンドラを設定し、SSLSocketFactory
およびHostnameVerifier
のデフォルトを初期化します。 デフォルトの設定には、HttpsURLConnection.setDefaultSSLSocketFactory
とHttpsURLConnection.setDefaultHostnameVerifier
が使用されます。
アプリケーション内でこれら2つのメソッドが使用されている場合、Java Web StartのHTTPSハンドラの初期化後にそれらのメソッドを呼び出すようにしてください。そうしないと、アプリケーションのカスタム・ハンドラが、Java Web Startのデフォルト・ハンドラで置き換えられてしまいます。 次のいずれかを実行して、カスタマイズした独自のSSLSocketFactory
および HostnameVerifier
が使用されていることを確認できます:
HttpsURLConnection.setDefaultSSLSocketFactory
または HttpsURLConnection.setDefaultHostnameVerifier
をコールするのは、最初にJava Web Start HTTPSハンドラ初期化コードを実行する最初の HttpsURLConnection
オブジェクトが作成された後のみです。webサーバーにJava Web Startアプリケーションをデプロイするプロセスを簡略化するダウンロード・サーブレットの作成、および拡張機能の提供の詳細は、「JnlpDownloadServletガイド」を参照してください。