この章では、次のトピックについて説明します。
Java Web Startで配備可能なアプリケーションを開発する方法は、Java(TM) Platform Standard Edition向けのスタンドアロン・アプリケーションを開発する方法と、基本的には同じです。たとえば、アプリケーションのエントリ・ポイントは、通常のpublic static void main(String[] argv)です。
ただし、Web配備(アプリケーションを自動的にダウンロードして起動すること)をサポートし、アプリケーションを安全なサンドボックス内で実行するには、考慮すべき点がいくつかあります。それらを次に列挙します。
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は、ダウンロードされた信頼できない可能性のあるアプリケーションによってローカルのファイルやネットワークのセキュリティが低下しないことを保証できます。
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ガイド」を参照してください。