アプリケーション開発時の考慮点



この章では、次のトピックについて説明します。

はじめに

Java Web Start で配備可能なアプリケーションを開発する方法は、Java 2 プラットフォーム向けのスタンドアロンアプリケーションを開発する方法と、基本的には同じです。たとえば、アプリケーションのエンドポイントは、通常の public static void main(String[] argv) です。

ただし、Web 配備 (アプリケーションを自動的にダウンロードして起動すること) をサポートし、アプリケーションを安全なサンドボックス内で実行するには、考慮すべき点がいくつかあります。それらを以下に列挙します。

JAR ファイルからのリソースの取得

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

セキュリティとコード署名

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 2 プラットフォームのセキュリティ API に基づいています。Java 2 SE JRE 1.4.2 は、SHA1withDSA、MD5withRSA の両アルゴリズによるコード署名をサポートしています。

開発者が Java Web Start 用のコードに署名する方法は、Java アプレットの場合と同じです。つまり、Java 2 SE SDK に付属する標準ツール jarsigner を使用します。jarsigner ツールのマニュアルでは、コードの署名方法とテスト証明書の作成方法の具体例を示すとともに、署名に関するその他の問題について説明しています。

また、Java Web Start では、SDK/JRE 1.4.2 とともに使用する Netscape signtool の使用もサポートしています。詳細は Netscape の Web サイトを参照してください。http://developer.netscape.com/software/signedobj/

テスト証明書による JAR ファイルの署名

以下に、テスト証明書を使って JAR ファイルに署名する手順を示します。

1. SDK 1.4.2 の keytooljarsigner にパスが通っていることを確認します。これらのツールは、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 ファイルに対して繰り返します。


自己署名テスト証明書はあくまでも内部テスト専用であることに注意してください。この証明書はユーザの身元を保証できず、信頼性に欠けるからです。アプリケーションを本番環境に移す際には、VeriSignThawte などの認証局から信頼できる証明書を取得し、それを使用するようにしてください。

JNLP ファイルのエンコード方式

Java Web Start のバージョン 1.2 以降、J2SE プラットフォームでサポートされている任意の文字エンコーディングを使って、JNLP ファイルをエンコードできるようになりました(サポートされているエンコーディングの一覧については、J2SE ドキュメントを参照)。

JNLP ファイルをエンコードするには、そのファイルの XML prolog でエンコーディングを指定します。たとえば、次の行は、JNLP ファイルを UTF-16 でエンコードすることを示しています。

<?xml version="1.0" encoding="utf-16"?>

XML prolog そのものは、UTF-8 でエンコードする必要があります。

HTTPS 証明書の動的ダウンロード

1.4.2 以降、Java Web Start では、ブラウザとほぼ同じ方法で証明書が動的にインポートされます。このため、現在、Java Web Start では、java.protocol.handler.pkgs システムプロパティを使用して SSLSocketFactoryHostnameVerifier の両デフォルトを初期化する https ハンドラが独自に設定されています。デフォルトの設定には、HttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier が使用されます。

アプリケーション内でこれら 2 つのメソッドが使用されている場合、Java Web Start の https ハンドラの初期化後にそれらのメソッドを呼び出すようにしてください。そうしないと、アプリケーションのカスタムハンドラが、Java Web Start のデフォルトハンドラで置き換えられてしまいます。独自にカスタマイズされた SSLSocketFactoryHostnameVerifiter が使用されるようにするには、次のいずれかを実行します。

  1. 独自の https ハンドラをインストールすることで、Java Web Start の https ハンドラを完全に置き換える (詳細は、「A New Era for Java Protocol Handlers」を参照)
  2. HttpsURLConnection.setDefaultSSLSocketFactory または HttpsURLConnection.setDefaultHostnameVerifier の呼び出しを、必ず最初の https url オブジェクトが作成されたあとで行う (そうすれば、Java Web Start の https ハンドラの初期化コードが最初に実行される)

ダウンロードサーブレットの作成の詳細は、次の章、「JnlpDownloadServlet ガイド」を参照してください。