高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1175

Applet Signing with MRJ and Javakey


目次

概要

Javakey を使ってアプレットを署名する方法

署名済みアプレットをインストールして使用する方法

その他の注意とコメント

要約

プレットの署名は、Java コミュニティのいたるところで重要な議論のテーマになっています。アプレットの署名に関連するプロセスと手続きは一般に複雑で、混乱の原因になることがあります。また、ユーザの側でも、MRJ によるアプレットの使用と署名に関連したいくつかの問題を抱えています。このテクニカルノートでは、利用されているテクノロジについて説明し、jar ファイルの署名、証明書のインストール、および署名済みアプレットの正常な利用に必要な手続きを明確にするを目的にしています。


概要

アプレットの署名プロセスは、4 つの基本的な概念に基づく公開鍵暗号化システムを基礎にしています。公開鍵暗号化を支える 4 本の柱とは、公開/秘密鍵のペア、デジタル証明書、認証局、および暗号化アルゴリズムの 4 つです。キーのペアはメッセージを交換する手段を提供し、デジタル証明書は送信者と受信者両方の信頼性を保証します。また、認証局はデジタル証明書の有効性を保証し、暗号化アルゴリズムはメッセージの「スクランブル」を行います。

デジタル証明書とは、身元証明の一形式として動作するソフトウェアトークンのことで、運転免許証が運転者の身元証明に使用されるのに似ています。デジタル認証は電子署名の一形式として認められており、個人や企業のアイデンティティを認証するために使用されます。危険性の高いリクエストに応答する前に送信者が正当であるかどうかを検証することは、証明書の受信者の責任です。

デジタル署名は、デジタル証明書をデータの集合に適用し、データの作成者を保証するための手段です。かつて、書簡はロウで封印され、一目でわかるエンブレムをロウに刻印することで、その書簡の受取人は、その書簡が自分が想像する相手から送られたものであることを断定することができました。概念的には、アプレットの署名はこれとまったく同様ですが、その安全性と信頼性は格段に向上しています。Java コードに署名を行うというのは、完成したアプレットのデータ、クラスファイル、イメージファイル、データファイルなど、jar ファイルの形式で格納されたファイルにデジタル署名を適用することを意味します。このメカニズムにより、アプレットの出所を検証して、署名が行われた後でアプレットに変更が加えられていないことを確認することができます。転送中にインターセプトが行われた場合でも、変更を加えられたアプレットは署名の検証プロセスに合格しません。

エンドユーザが実行するコードがその署名者から送信されたもので、何ら悪意のないことを証明できるため、開発した Java アプレットのコードに署名を行うことは重要です。また、署名を行うことで、デベロッパは Java セキュリティ「sandbox」の外部にあるリソースにもアクセスできるようになります。一般に、開発したコードは、それがあたかもクライアントマシン上のアプリケーションであるかのように何の制限もなしに動作します。特に、署名を行うと、アプレットは次の機能にアクセスできるようになります。

  • アプレットのサーバとは異なるサーバ上で実行されているリモート オブジェクトへの RMI 呼び出しの発行
  • クライアント側のプログラムの実行
  • クライアント上に格納されているファイルの読み書き
  • ローカルプリンタへの印刷ジョブの送信
  • システムクリップボードへのアクセス
  • クライアントのシステムプロパティの読み込み (たとえば、ユーザ名など)
  • Reflection API を使ったオブジェクト (フィールド、メソッド、値など) の構造の判定
  • その他

アプレットセキュリティに関する MRJ によるインプリメンテーションでは、Sun の標準的な署名アプレットメカニズムを使用しています。Sun の Javakey ツールは、証明書の作成、jar ファイルの署名、身元データベースの管理、およびその他の関連タスクの実行に使用されます。Javakey ツールは、公開/秘密鍵のペアとそれに関連する証明書を含むデータベースを管理します。Javakey ツールを使って jar ファイルに署名を行うため、Javakey のデータベースには公開/秘密鍵のペアが含まれていなければなりません。Javakey ツールは、「機能拡張」フォルダの MRJ Libraries:lib:security フォルダの中にある java.security という名前のセキュリティプロパティファイルに含まれる identity.database プロパティによって指定された位置でデータベースを検索します。デフォルトの設定では、このデータベースは「identitydb.obj」という名前のファイルで、「初期設定」フォルダの中に格納されています。このデータベースは、多数のさまざまな潜在的署名者に対するキーのペアを保持しており、それぞれのキーのペアは署名者のユーザ名と関連づけられています。キーのペアに加えて、Javakey のデータベースには、公開鍵に対応する証明書が含まれています。新しい証明書がこのデータベースに追加されると、Javakey は識別を目的として重複しない番号をその証明書に割り当てます。


Javakey を使ってアプレットを署名する方法

はじめに

  1. アプレットに関連したクラスをすべて jar ファイルにパッケージします。jar ファイルがマニフェストを使って生成されていることを確認します。この jar ファイルを「MyApplet.jar」と呼ぶことにします。
  2. 公開鍵のファイルを作成します。このファイルは存在していることだけが必要で、内容は後で作成されます。
    • たとえば、SimpleText を使って、「public.key」という名前のファイルを作成します。
  3. 秘密鍵のファイルを作成します。このファイルは存在していることだけが必要で、内容は後で作成されます。
    • たとえば、SimpleText を使って、「private.key」という名前のファイルを作成します。?/LI>

認証ディレクティブファイル(Directive File)の作成

Javakey に認証情報を提供するには、ディレクティブファイルを使用します。このファイルは基本的に、jar ファイルの署名を行うときに Javakey が読み込むプロパティファイルです。

SimpleText を使って、認証ディレクティブ情報を持つファイルを作成します。ここでは、このファイルを「cert.directive」と呼ぶことにします。このファイルの内容は以下のとおりです。

# Information about the issuer
#
issuer.name=SpiffyCo
                  
# The certificate to use for the signing (required if this is not
# self-signed). In this case it is commented out since we are
# self-signing.
#
# issuer.cert=1
                  
# Information about the subject
#
subject.name=SpiffyCo
subject.real.name=Spiffy Neat-O Co.
subject.org.unit=SpiffyCo Development
subject.org=Spiffy Neat-O Co. Inc.
subject.country=USA
                  
# Information about the certificate
#
start.date=01 January 1998
end.date=31 December 1999
                  
# as an issuer you need to make sure this number is unique.
serial.number=123456
                  
# Signature algorithm to be used.
# Either DSA or MD5/RSA
#
signature.algorithm=DSA
                  
                  # Name of the file to which to save a copy of the certificate
#
out.file=SpiffyCo.cert

プロパティの説明

  • issuer.namesubject.name
    データベースのユーザ名。issuer.name は、証明書の署名と発行を行う署名者の名前です。subject.name は、証明書の発行者によって認証される公開鍵を含んだエンティティ (身元または署名者) の名前です。
  • issuer.cert
    認証ファイルの署名に使用され、サブジェクトの公開鍵を認証することになる発行者の証明書を指定します。このプロパティの値は、証明書の生成またはインポートを行ったときに、Javakey が発行者の証明書に割り当てた番号でなければなりません。Javakey が証明書に割り当てた番号を確認するには、Javakey のポップアップメニューで「List All Detailed」項目を選択し、「Do Javakey」ボタンをクリックします。

    注意:
    この issuer.cert プロパティは、生成される証明書が自己署名されない場合のみ必要となります (自己署名証明書とは、issuer.namesubject.name が等しい証明書のことです)。


  • subject.real.name, subject.org.unit, subject.org, および subject.country
    これらのプロパティはそれぞれ、サブジェクトの一般名、組織単位、組織、および国を参照する X.500 に準拠した名前コンポーネントです。
  • start.dateend.date
    証明書の有効期間の開始日と終了日 (そしてオプションで開始時刻と終了時刻) を指定する文字列。証明書はこの開始日時から終了日時まで有効です。開始日と終了日の文字列は、String 型の引数をとる java.util Date メソッドが認識できるものならどんな文字列でもかまいません。指定された時刻を含まない日付は、指定された日付の 0 時を意味するものと解釈されます。
  • serial.number
    シリアル番号。特定の発行者に対してこの番号はユニークなもので、その発行者によって署名された他の証明書からこの証明書を識別できるものでなければなりません。
  • signature.algorithm
    証明書の署名に使用される署名アルゴリズムの名前。この引数は省略可能です。signature.algorithm が指定されていないと、DSA (Digital Signature Algorithm) が使用されます。ただしその場合、署名者の公開鍵と秘密鍵は DSA アルゴリズムに対応している必要があります。非 DSA アルゴリズムを使用できるのは、以下の場合のみです。
    1. 指定されている名前が標準的なアルゴリズム名である。
    2. アルゴリズムのインプリメンテーションを提供するプロバイダが静的にインストールされている。
    3. 署名者のキーが指定されたアルゴリズムに対応している。たとえば、signature.algorithm プロパティの値が MD5/RSA または SHA-1/RSA の場合、署名者のキーは RSA キーでなければなりません。
  • out.file
    証明書を保存するファイルの名前。この引数は省略可能です。


署名ディレクティブファイル(Signature Directive File)の作成

ファイルに署名を行うには、Javakey にいくつかの情報を指定する必要があります。つまり、使用するキーのペアのユーザ名、使用する証明書の番号、生成された署名と署名ブロックファイルに使用される名前、および出力される署名済み jar ファイルの名前です。この場合も、前述のものとは別のディレクティブファイルを使って、Javakey に情報を提供します。

SimpleText を使って、この署名ディレクティブ情報のファイルを作成します。ここでは、このファイルを「sign.directive」と呼ぶことにします。このファイルの内容は以下のとおりです。

# Which signer to use. This signer must be in the database.
#
signer=SpiffyCo
                  
# Certificate number to use for this signer.
#
cert=1
                  
# Certificate chain depth.
#
chain=0
                  
# The name that the signature file and signature block file are to have.
# The signature name must be 8 characters or less.
#
signature.file=SPIFFSIG
                  
                  # The name to give to the signed JAR file.
#
out.file=MySignedApplet.jar

プロパティの説明

  • signer
    signer プロパティは、Javakey が jar ファイルの署名に使用することになるキーのペアに対応したユーザ名を指定します。この例では、Javakey は「SpiffyCo」というユーザに属するキーのペアを使ってファイルの署名を行います。
  • cert
    この署名者が使用する証明書の番号。このプロパティは、PKCS#7 ブロックに含まれる証明書を指定します。このプロパティは必ず指定する必要があり、1 の基数となります。その値は、証明書の生成 (またはインポート) を行ったときに、Javakey が署名者の証明書に割り当てた番号でなければなりません。Javakey が証明書に割り当てた番号を確認するには、Javakey のポップアップメニューで「List All Detailed」項目を選択し、「Do Javakey」ボタンをクリックします。
  • chain
    組み込む証明書のチェーンの認証チェーン深度。このプロパティは現在サポートされていません。
  • signature.file
    生成された署名ファイルとそれに関連づけられた署名ブロックに与えられる名前。この名前は 8 文字以下でなければなりません。生成された署名ファイルとそれに関連づけられた署名ブロックは、この名前と、それぞれ .SF および .DSA というファイル拡張子を持つことになります。
    この例では、それぞれのファイル名は SPIFFSIG.SF および SPIFFSIG.DSA になります。
    生成された .SF および .DSA ファイルは、META-INF ディレクトリの署名済み jar ファイルに追加されます。署名済み jar ファイルに含まれるこれらの名前を持つファイルは上書きされます。
  • out.file
    Javakey が生成する署名済み jar ファイルに与える名前。このプロパティは省略可能です。このプロパティが存在しないと、Javakey は元の jar ファイルと同じ名前を署名済みファイルに付けますが、ファイル拡張子は「.sig」になります。


Javakey での作業

  1. 以上の手順で、公開および秘密鍵ファイル、認証および署名ディレクティブファイルのセットアップが完了し、その先に進んで Javakey を使用する準備が整いました。SDK の一部である Javakey アプリケーションは、MRJ SDK とともにダウンロードでき、作業を進める前にインストールしておく必要があります。準備が整ったら、Javakey アプリケーションを起動します。このアプリケーションは、MRJ SDK のローカルコピーの次の位置に保存されています。
    MRJSDK
      Tools
        JDK Tools
          javakey

    現在データベースを変更しており、他のステップを実行する前に特定の情報がデータベース内に存在する必要があるため、順序どおりに次のステップを実行することが重要です。
  2. 署名者の作成
    Javakey の中でいずれかの機能を使用するためには、署名者または身元が必要になります。
    • Javakey のポップアップリストから「Create Signer」を選択します。
    • 名前を入力します。この名前は、認証ディレクティブファイルの issuer.name プロパティ、および署名ディレクティブファイルの signer プロパティと同じものでなければなりません (この例では、「SpiffyCo」)。この名前では大小文字が区別されます。
    • Trusted」チェックボックスにチェックマークを入れます。
    • Do Javakey」ボタンをクリックします。
  3. キーペアの生成
    キーペアは署名を目的として使用されます。キーペアは、公開鍵の部分と秘密鍵の部分から構成されます。アプレットは秘密鍵の部分を使って署名され、配布された証明書には公開鍵の部分が含まれます。そして、これらの 2 つの組み合わせが符合したときにはじめて安全なアプレットであることが証明されます。
    • Javakey のポップアップリストから「Generate Key Pair」を選択します。
    • 必要なキーサイズを選択します。値を大きくするほど安全性が高まりますが、作成と実行時の検証に時間がかかるようになります。
    • 「Public Output File」で、以前に作成した公開鍵ファイル (「public.key」) を選択します。
    • 「Private Output File」で、以前に作成した秘密鍵ファイル (「private.key」) を選択します。
    • Do Javakey」ボタンをクリックします。
    • しばらく待ちます。処理が完了するまでにしばらく時間がかかることがあり、しかも進捗状況に関するフィードバックは表示されません。処理が完了すると、コンソールウインドウに「Done」メッセージが表示されます。
  4. 証明書の生成
    これは実際には自己署名証明書になります。公的性格を持つ正式な仕様の証明書が必要な場合は、Verisign などの企業のサービスを使用する必要があります。
    • Javakey のポップアップリストから「Generate Certificate」を選択します。
    • Certificate Directive File」ポップアップリストを使って、以前に作成した認証ディレクティブファイル (「cert.directive」) を選択します。
    • 「Do Javakey」ボタンをクリックします。
    • 「SpiffyCo.cert」という認証ファイル (認証ディレクティブファイルの中で指定されている) が、Javakey アプリケーションが保存されているフォルダ内に作成されます。
    • これはアプレットを利用するエンドユーザに配布する必要のあるファイルであるため、より適切な位置に移動することをおすすめします。
  5. Jar ファイルの署名
    • Javakey のポップアップリストから「Sign File」を選択します。
    • Directive File」として、以前に作成した署名ディレクティブファイル (「sign.directive」) を選択します。
    • 「Java Archive File」として、「MyApplet.jar」という名前のアプレット jar ファイルを選択します。
    • Do Javakey」ボタンをクリックします。
    • しばらく待ちます。処理が完了するまでにしばらく時間がかかることがあり、しかも進捗状況に関するフィードバックは表示されません。処理が完了すると、コンソールウインドウに「Done」メッセージが表示されます。
    • 「MySignedApplet.jar」という署名済みの jar ファイル (署名ディレクティブファイルの中で指定されている) が、Javakey アプリケーションが保存されているフォルダ内に作成されます。
    • この新しく作成された jar ファイルは、その前に生成したキーペアを使って署名されており、通常のアプレット jar ファイルとまったく同様に動作する準備が整っています。

ページの先頭に戻る

署名済みアプレットをインストールして使用する方法

MRJ 2.1.x では、以下の手順にしたがって、証明書をクライアントマシンにインストールする必要がありますが、MRJ 2.2 には別のオプションが用意されています。

  1. インストール先となるシステムに認証ファイルを取得します (この例では、「SpiffyCo.cert」)。
  2. クライアントマシンで Javakey を使って証明書をインストールする必要があるため、操作を進める前にあらかじめ MRJ SDK をインストールしておく必要があります。
  3. 準備が整ったら、Javakey アプリケーションを起動します。このアプリケーションは、MRJ SDK のローカルコピーの次の位置に保存されています。
    MRJSDK
      Tools
        JDK Tools
          javakey
  4. Select Create Identity from the javakey popup menu, and enter a name.
  5. Javakey のポップアップメニューから「Create Identity」を選択し、名前を入力します。
    • この名前が元の署名者と同じ名前である必要はありません。どんな名前を入力してもかまいません。
  6. Trusted」チェックボックスにチェックマークを入れます。
  7. Do Javakey」ボタンをクリックします。
    • これにより、この証明書に関連づけられる身元が作成されます。
  8. Javakey のポップアップリストから「Import Certificate」を選択します。
  9. Select File...」ポップアップを使って、ローカルシステム上にある認証ファイルを選択します (この例では、「SpiffyCo.cert」)。
  10. Do Javakey」ボタンをクリックします。
  11. これで、公開鍵に関連づけられた秘密鍵を使って署名されたアプレットが正式に認可され、そのアプレットはアプリケーションとまったく同様にシステムにフルアクセスできるようになります。

MRJ 2.2 では署名済みアプレットのサポートが拡張されているため、上述の手順は必要ありません。ユーザが署名済みアプレットにアクセスし、その証明書がすでに Java セキュリティデータベースの中にあると、アプレットは制限なしに実行されます。証明書がまだ Java セキュリティデータベースの中にない場合は、証明書に関する情報を提供するダイアログボックスが表示されます。

Certificate Dialog

ユーザは、次の 3 つの操作のいずれかを選択できます。

  1. 証明書を常に受け入れ、それを Java セキュリティデータベースに追加する。
  2. アプレットをすぐに実行するが、証明書をデータベースに追加しない。
  3. 証明書を拒否する。

ページの先頭に戻る

その他の注意とコメント

次に、MRJ で署名済みアプレットを使った作業を行うときに検討する必要のある、いくつかの重要項目について説明します。

  • MRJ では、Sun の標準的な署名アプレットメカニズムを使用しているため、特定のプラットフォームでアプレットの署名を行う必要はありません。クライアントマシンが Javakey の認証方法を認識できるかぎり、署名を行ったプラットフォームが何であるかは問題になりません。
  • MRJ のセキュリティデータベースは、ブラウザによって保守されているデータベースとは別物です。このため、多くの場合は、署名を 2 度受け付ける必要があります。つまり、ブラウザに対する 1 回と、MRJ に対する 1 回です。
  • Java 1.1.x のセキュリティモデルは「All-or-Nothing」モデルです。Java 2 の階層的なセキュリティモデルとは異なり、Java 1.1.x のセキュリティモデルはフラットであり、非常に厳しいセキュリティまたは非常に貧弱なセキュリティのいずれかしか提供しません。
  • MRJ では Netscape 形式のアプレット署名はサポートされていません。
  • Mac 版の Netscape は現在 (Navigator 4.6.1) MRJ を使用していません。また、Netscape では独自の署名メカニズムを採用していて、これは、Javakey と MRJ によって使用される方法と互換性がありません。
  • MRJ 2.1.x では Microsoft 形式の CAB ファイルはサポートされていません。MRJ 2.2 では CAB ファイルを最小限サポートしていますが、まだ署名済みの CAB ファイルや圧縮されている CAB ファイルを正しく解釈できません。

Back to top

要約

一般に、アプレットには、ハードディスクへのアクセス、印刷、または自分のサイト以外のサイトへの接続は許可されません。Java はこれらの制限や、その他の制限を実施して、個人情報を読み取ろうとするコード、望ましくない情報を書き込もうとするコード、またはその他の予期せぬ動作を実行するコードからユーザを保護します。署名済みのアプレットには、それが信頼できる誰かによって作成されたことと、それが署名後に変更されていないことを保証する証明書が含まれています。署名されているアプレットは、もはや前述の制限にはしたがいません。アプレットの署名は、洗練されたアプレットの開発を促進し、それらのアプレットがクライアント側のリソースにアクセスすることを可能にすると同時に、エンドユーザがアプレットのコードを実行するときに、それなりのレベルのセキュリティと保証を提供することのできる非常に便利なテクノロジです。

参考文献


ページの先頭に戻る

 


更新日: 1999 年 10 月 5 日