この章では、次のトピックについて説明します。
Java Web Start で配備可能なアプリケーションを開発する方法は、Java(TM) Platform Standard Edition 向けのスタンドアロンアプリケーションを開発する方法と、基本的には同じです。たとえば、アプリケーションのエントリポイントは、通常の public static void main(String[] argv) です。
ただし、Web 配備 (アプリケーションを自動的にダウンロードして起動すること) をサポートし、アプリケーションを安全なサンドボックス内で実行するには、考慮すべき点がいくつかあります。それらを次に列挙します。
Java Web Start によって Web サーバーからクライアントマシンに転送されるのは、JAR ファイルだけです。また、JAR ファイルをローカルマシン上のどこに格納するかは、Java Web Start が判断します。したがって、イメージや設定ファイルといったリソースへのディスク相対参照を、アプリケーション内で使用することはできません。
すべてのアプリケーションリソースは、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 は、ダウンロードされた信頼できない可能性のあるアプリケーションによってローカルのファイルやネットワークのセキュリティーが低下しないことを保証できます。
Java Web Start がサポートするもう 1 つのセキュリティー機能は、デジタルコード署名です。起動対象のアプリケーションが 1 つまたは複数の署名付き JAR ファイルとして配信された場合、Java Web Start は、それらの JAR ファイルの内容が署名後に変更されていないかどうか検証します。デジタル署名の検証に失敗した場合、そのアプリケーションは第三者によって改ざんされた可能性があるため、Java Web Start はアプリケーションの実行を中止します。
コード署名のサポートは、ユーザーとアプリケーションサービスプロバイダの双方にとって重要です。このサービスを使えば、ユーザーは、アプリケーションの提供元が信頼できるかどうかを検証できます。コードに署名するのはアプリケーションサービスプロバイダであるため、そのアプリケーションに対して Web 上の第三者が偽装できないことが、ユーザーとプロバイダの両者に対して保証されます。また、ユーザーによって信頼された署名付きのアプリケーションは、ローカルディスクへのアクセスなど、追加のシステム権限を要求することもできます。
Java Web Start は、アプリケーションを起動する前に、署名者の証明書に基づいて、アプリケーションの提供元を示すダイアログを表示します。これにより、ユーザーは、ダウンロードされたコードに追加の権限を許可すべきかどうかを、具体的な情報に基づいて決定できます。
アプリケーションのすべての JAR ファイルが署名されていれば、JNLP ファイル内に次の設定を含めることで、アプリケーションはクライアントシステムへの完全なアクセスを要求できるようになります。
<security> <all-permissions/> </security>
Java Web Start におけるコード署名の実装は、コア Java(TM) Platform Standard Edition のセキュリティー API に基づいています。Java 2 SE JRE 1.4.2 は、SHA1withDSA、MD5withRSA の両アルゴリズによるコード署名をサポートしています。
開発者が Java Web Start 用のコードに署名する方法は、Java アプレットの場合と同じです。つまり、Java(TM) Platform Standard Edition に付属する標準ツール jarsigner を使用します。jarsigner ツールのマニュアルでは、コードの署名方法とテスト証明書の作成方法の具体例を示すとともに、署名に関するその他の問題について説明しています。
次に、テスト証明書を使って JAR ファイルに署名する手順を示します。
1. SDK 1.4.2 の keytool
と jarsigner
にパスが通っていることを確認します。これらのツールは、SDK の bin ディレクトリに格納されています。
2. 新しい keystore
内に新しいキーを作成します。次のようにします。
keytool -genkey -keystore myKeystore -alias myself
パスワード、名前など新しいキーに関する情報の入力が要求されます。この情報に基づいて、ディスクに myKeystore
ファイルが作成されます。
3. 続いて、自己署名テスト証明書を作成します。次のようにします。
keytool -selfcert -alias myself -keystore myKeystore
証明書を作成すると、パスワードの入力を求められます。証明書の生成には数分かかります。
4. すべてが正常であることを確認します。キーストアの内容を一覧表示するには、次のコマンドを使用します。
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
5. 最後に、テスト証明書を使って JAR ファイルに署名します。次のようにします。
jarsigner -keystore myKeystore test.jar myself
この手順を、すべての JAR ファイルに対して繰り返します。
自己署名テスト証明書はあくまでも内部テスト専用であることに注意してください。この証明書はユーザーの身元を保証できず、信頼性に欠けるからです。アプリケーションを本番環境に移す際には、VeriSign や Thawte などの認証局から信頼できる証明書を取得し、それを使用するようにしてください。
Java Web Start のバージョン 1.2 以降、Java(TM) Platform Standard Edition でサポートされている任意の文字エンコーディングを使って、JNLP ファイルをエンコードできるようになりました。(サポートされているエンコーディングの一覧については、Java(TM) Platform Standard Edition のドキュメントを参照。)
JNLP ファイルをエンコードするには、そのファイルの XML prolog でエンコーディングを指定します。たとえば、次の行は、JNLP ファイルを UTF-16 でエンコードすることを示しています。
<?xml version="1.0" encoding="utf-16"?>
XML prolog そのものは、UTF-8 でエンコードする必要があります。
1.4.2 以降、Java Web Start では、ブラウザとほぼ同じ方法で証明書が動的にインポートされます。このため、現在、Java Web Start では、java.protocol.handler.pkgs
システムプロパティーを使用して SSLSocketFactory
と HostnameVerifier
の両デフォルトを初期化する https ハンドラが独自に設定されています。デフォルトの設定には、HttpsURLConnection.setDefaultSSLSocketFactory
と HttpsURLConnection.setDefaultHostnameVerifier
が使用されます。
アプリケーション内でこれら 2 つのメソッドが使用されている場合、Java Web Start の https ハンドラの初期化後にそれらのメソッドを呼び出すようにしてください。そうしないと、アプリケーションのカスタムハンドラが、Java Web Start のデフォルトハンドラで置き換えられてしまいます。独自にカスタマイズされた SSLSocketFactory
と HostnameVerifiter
が使用されるようにするには、次のいずれかを実行します。
HttpsURLConnection.setDefaultSSLSocketFactory
または HttpsURLConnection.setDefaultHostnameVerifier
の呼び出しを、必ず最初の https url オブジェクトが作成されたあとで行う (そうすれば、Java Web Start の https ハンドラの初期化コードが最初に実行される)。ダウンロードサーブレットの作成の詳細は、次の章、「JnlpDownloadServlet ガイド」を参照してください。