2.Sandboxの外にでるには
 

2.1    Sandboxの外にでるには

Javaアプレットでローカルコンピュータのハードディスク内にあるファイルにアクセスしたり、自分がダウンロードされてきたWebサイト以外のサーバに対しTCP/IP通信を行うにはSandboxの外に出る必要があります。Sandboxの外に出た状態を、”特権を得た”といいます。アプレットが特権を得るには、少なくともそのアプレットに電子署名がされていなければなりません。少なくともといったのは、それだけではたりないのです。その足りない部分といのは、Javaの新しい機能であるセキュリティマネージャにお伺いをたてなければならないことです。
しかし、アプレットへの署名のやり方、およびそのお伺いのたてかたが、ブラウザーベンダによって異なっています。
 
JavaSoft Netscape Microsoft
署名のやり方 JDKに梱包されているjavakeyコマンドでキーペアを作成、署名を行い、jarコマンドでjarファイルをビルドする Communicatorでキーを作成、NetscapeのWEBサーバからダウンロードできるsigntoolで署名を行い同時にjarファイルをビルドする SDKforJapaに梱包されているmakecertコマンドでデジタル証明書を作成し、cabarcコマンドでcabファイルをビルドする
セキュリティマネージャ 明示的に使用しない 
 
Capabilityクラスを使用する(必須) 明示的に使用しない 
 
 
ここでは、Netscapeの方式を例に取り、署名付きアプレットを作成する方法を説明します。
本章では、アプレット、に署名をする方法、及びNetscapeのセキュリティ関連のクラス群であるCapabilityクラスを使って、開発者が必要とする特権をシステムに要求する方法の概要を説明します。後の章で各々について詳細を説明します。

2.2    署名をする
 

アプレットを作成すると、Classファイルが作成されます。これらのファイルは複数にわたる場合があります。これらのクラスのうち、特権を必要とするクラスには署名を行います。特権を必要としなくても署名を行ってもよいので、結局すべてのファイルに署名をします。
ところで署名とはいったい何なの?とは当然の疑問です。通常、署名とは自分が認めたものに自分が書き下す自分の名前です。電子署名の場合は、あるもの(この場合はクラスファイルです)に、署名に相当するファイルを添付することをいいます。これには、公開鍵暗号技術が使用されます。

公開鍵暗号を簡単に説明します。開発者はまず最初に鍵のペアを作成します。鍵は2つ作成されます。鍵を使って情報を暗号化できます。公開鍵を使って暗号化された情報は、秘密鍵でしか復号できません。逆に秘密鍵を使って暗号化された情報を復号できるのは、公開鍵にかぎられます。秘密鍵を所有者が厳重管理することによって、公開鍵を持っている人がある暗号化された情報をその公開鍵で復号化した結果、元通りになったら、その情報は秘密鍵所有者によって暗号化されたと思ってよいことになります。すなわちその情報は、秘密鍵所有者によって作成されたものと思って良いわけです。
鍵といってもコンピュータのことですから、結局は数字の組み合わせです。公開鍵だけから秘密鍵を予測されるとこの方式は成り立たなくなります。この鍵を生成する代表的な方式は米国のRSA社から提供されております。
RSA方式は、公開鍵から秘密鍵を解くことが困難であるため、業界標準となっています。
公開鍵はその作成者により配布されますが、そこに悪意を持った人が介入すると、ニセの公開鍵にすりかえられる可能性があります。そこで、広く万人が認める公開鍵保証者という組織が必要になります。これをCAといいます。秘密鍵、公開鍵を作ったら、公開鍵を厳重に保護することはもちろんですが、その公開鍵をまずCAに提出します。CAは公開鍵提出者も身元を確認すると、その公開鍵の保証書を発行します。保証書には、CAの保証情報と申請者の公開鍵が埋め込まれています。このCAから発行された公開鍵の保証書をデジタル証明書といいます。秘密鍵の所有者は、公開鍵そのものを配布するのではなく、公開鍵の埋め込まれたディジタル証明書を配布します。CAはVeriSign社などが有名です。しかし、イントラネットなどで使用するために、企業内部で独自のCAを作ることもできます。更には、元来の意味をまったく失いますが、自分で自分自身を保証したデジタル証明書を作ることもできます。これは、Javaアプレット開発中のデバッグ中に使用されます。
 
公開鍵暗号方式を使用して、どのように信頼できるアプレットをユーザのもとにダウンロードし(図1)、ユーザはいかにそのアプレットが正当に開発者が開発したものであるかを確認するのか(図2)を説明します。
開発者は、事前に自分のキーペアを作成し、秘密鍵は厳重に管理します。公開鍵は信頼できるCAに提出し、デジタル証明書を発行してもらいます。そのデジタル証明書に公開鍵が埋め込まれています。
アプレットを開発したら、そのアプレットに署名をします。署名は、以下の手順を踏みます。

1.アプレットファイルからMD5と、SHA1方式でハッシュ値を計算する

    ハッシュ値とは、一種のチェックサム、FSC、パリティのようなもので、あるデータの固まりから対応付けされた固定長の数値です。データの固まりからハッシュ値を算出する関数をハッシュ関数といいます。MD5では、16バイト、SHA1は20バイト長です。あるデータの固まりとは、今のケースでは、Javaのクラスファイルです。クラスファイルの中身が少しでも変更されると、ハッシュ値がぜんぜん違う値になるものが、性能のよいとされています。ハッシュとは、元々切り刻むという意味で、ハッシュビーフ(ハヤシライス)のハッシュです。Javaクラスは数10Kバイトから数100Kバイトの大きさですが、それをたった16バイトに要約します。このため、ハッシュ値はダイジェスト(要約)といわれることもあります。
 
2.ハッシュ値を秘密鍵で暗号化する

先に作成した秘密鍵で、作成したハッシュ値を暗号化します。暗号化されたハッシュ値は、公開鍵以外で復号かするのは非常に困難です。逆に、開発者から提供された公開鍵で復号化できた情報は、秘密鍵以外で暗号化されたものではないということもできます。
秘密鍵で暗号化されたハッシュ値を電子署名といいます。

.Jarファイルにパッケージ化する

作成された,(1)Javaアプレット、(2)ディジタル証明書、(3)署名ファイルの3点セットを1つのファイルにまとめます。この3つのファイルを1つにまとめたものを署名付きアプレットといいます。複数のファイルを1つにまとめる方法としては、ZIP、LHA、TARなどいろいろありますが、Sunが提唱し、ネットスケープが採用した方式はJARです。JARはそのスペルから想像できるようにTARのJava版です。複数のファイルを単に1のファイルにまとめるだけなら、JARコマンドを使ってもよいのですが、ハッシュ値の計算、暗号化、JARファイルの作成を1度に行ってくれるコマンドがネットスケープより提供されています。このコマンドの使用方法は後述します。
 

 図1 アプレットへの署名
 
4.署名付きアプレットを受信する

署名つきアプレットは受信されると、各々の構成ファイルに分解されます。構成ファイルはJavaクラスファイル、デジタル証明書、署名ファイルの3点でした。
 

5.デジタル証明書の正当性の確認

デジタル証明書の保証者が信頼できるものかどうか確認します。ネットスケープナビゲータなどには、インストール時に、すでに有名どころのCA自体のデジタル証明書はプレインストールされています。受信したデジタル証明書の保証者(CA)が、プレインストール済みのCAであれば、受信したデジタル証明書は信頼できるものとみなし、その中に埋め込まれている公開鍵も信頼してよいものとみなします。

6.電子署名を復号化する

電子署名をデジタル証明書に埋め込まれた公開鍵を使って復号化します。これは、Javaクラスファイルのハッシュ値になっているはずです。

7.独自にハッシュ値を計算する

MD5やSHA1でもう一度、ハッシュ値を計算しなおします。

8.チェック

独自に計算したハッシュ値と、電子署名を公開鍵で復号化した値を比較します。この比較で双方違いがなければクラスファイルが改ざんされた可能性はかなり低く、またデジタル証明書の所有者がその秘密鍵を使って暗号化した、すなわち署名したものとみなしてよさそうであると判断します。
 

 

2.3    Capabilityクラスを使う

NetscapeCommunicatorでアプレットをSandboxの外に出すには、アプレットに署名するだけでは不十分です。アプレットに署名しただけですべての処理を許容するのは危険で、プログラマーはプログラムの中で、自分がやりたいことに対応した特権の要求を明示的に行わなければなりません。例えばファイルを読みたいなら、”ファイルを読む”という特権を取得しなければなりません。こうしておけば、プログラマがミスにより誤った動作を記述したり、そのクラスがプログラマの意図しないような使い方をされたりすることを避ける意味があります。
実際の使い方については後述します。



 
次ページ
 
目次に戻る
(c) 1998 Hiroaki Hata