javakey - Java セキュリティツール

エンティティ (人、会社など) のデータベース、公開鍵と秘密鍵、および認定書を管理します。また、アーカイブファイルの署名を生成し証明します。

機能説明

javakey [ options ]

説明

javakey は、SUN 社のセキュリティプロバイダコマンド行ツールです。このツールの第一の目的は、アーカイブファイルのデジタル署名を生成することです。署名は、ファイルが指定のエンティティ ("signer") から転送されてきたものであることを証明します。特定ファイルの署名を生成するには、署名者は、まずそのファイルの公開鍵と秘密鍵のペアを持つ必要があります。また、その公開鍵を認証する認定書が 1 つ以上必要です。したがって、 javakey は、各エンティティが「信頼できる」かどうかを示すだけでなく、エンティティ、鍵および認定書の永続的なデータベースを構築し管理します。

アイデンティティ、署名者、鍵

javakeyが管理するエンティティには、 identitiessigners の 2 つのタイプがあります。

アイデンティティは、公開鍵と現実世界のエンティティ (人、会社または組織など) を関連付けるものです。またアイデンティティは、公開鍵を認証する 1 つ以上の認定書と関連している可能性があります。認定書は、1 つのエンティティからのデジタル署名された文書です。それには、あるエンティティの公開鍵には特別な値があることが書かれています(認定書を参照してください)。

署名者 は公開鍵の他に、対応する秘密鍵をもつエンティティです。秘密鍵は署名に使う公開鍵とは異なります。ファイルに署名する前に、署名者は公開鍵とそれと関連する秘密鍵を、ペアでもつ必要があります。公開鍵を認証する認定書も少なくとも 1 つは必要です。

javakey では、既存の鍵をインポートしたり、アイデンティティや署名者と関連する新しい鍵を作ることもできます。同様に、認定書も既存のものをインポートしたり、新しく作成することができます。

アイデンティティと署名者のためのデータベースのユーザ名

すべてのエンティティ (アイデンティティと署名者) には、javakey によって管理されるデータベースに対してローカルな username があります。ユーザ名は、-c (アイデンティティ作成) オプションや -cs (署名者作成) オプションを使用して、データベースへエンティティを追加するときに指定されます。後の javakey コマンドは、エンティティを参照するのにこれと同じユーザ名を使わなければなりません。たとえば、信頼すべき署名者が作成され、ユーザ名として duke を代入すると仮定します。そのときのコマンドは、次のとおりです。

    javakey -cs duke true
次に、鍵のサイズに 512 ビットを使用して、署名者用の DSA 公開/秘密鍵のペアを生成するには、次のコマンドを使用します。
    javakey -gk duke DSA 512

アイデンティティと署名者に関連する信頼

JDK 1.1 では、クライアント (たとえば、エンドユーザまたはシステム管理者) は javakey を使用して、ある信頼されるエンティティを宣言することができます。

appletviewer は、信頼されるエンティティによって (javakey を使用して) 署名された JAR ファイルの中でダウンロードされた場合に、任意のアプレットがローカルなアプリケーションとまったく同じ権限で実行されることを可能にします。すなわち、そうしたアプレットは、元の Java セキュリティモデルの「サンドボックス」制約に拘束されません (細かくいえば、javakey が管理するデータベースは、署名が認証できるように、JAR ファイルに署名したエンティティの公開鍵の認定書のコピーも持たなければならない点があります)。今後のリリースでは、許される限り信頼性レベルのより確かなものを提供していきます。 javakey により管理されるデータベースはエンティティの username、 認定書、および各エンティティの信頼レベルを保存します。データベースへエンティティを追加するとき、信頼されるまたは信頼されない (デフォルト設定) エンティティであることをその時点で宣言できます。

    javakey -cs duke true

    javakey -cs bob false

    javakey -cs morty 
最初の例は、duke と名付けた署名者を信頼されるエンティティとして作成しています。次の 2 つの例は、署名者 bobmorty を信頼されないエンティティとして作成しています。信頼のレベルを指定しない場合、デフォルトにより、エンティティは信頼されません。

後で、前に信頼されなかったエンティティを信頼されるエンティティと宣言することができます。

    javakey -t morty true
同様に、前に信頼されたエンティティを信頼されないエンティティと宣言することもできます。
    javakey -t duke false
エンティティデータベースの全体の状態を見るには、
    javakey -ld
を使用してください。 データベースの中の 1 つのエンティティ (この場合、morty) の状態を見るには、
    javakey -li morty
を使用してください。

データベースの位置

javakey が管理するデータベースは、デフォルト設定では、identitydb.obj という名前のファイルに格納されています。 データベースは秘密鍵を含む場合があるので、安全な場所に保管する必要があります。デフォルト設定では、データーベースは、JDK インストール ディレクトリに格納されています。別の位置が望ましい場合は java.security と呼ばれるセキュリティ マスタプロパティファイルの中の identity.database の値を設定することにより、指定することができます。そのファイルは JDK セキュリティプロパティディレクトリの java.home/lib/security に常駐します。ここで、java.home は、JDK インストールされたディレクトリです。

たとえば、位置を指定するには、次のようにします。

	identity.database=C:\a\safe\directory\identitydb.obj 

認定書

javakey は、認定書のインポート、作成、表示および保存を行います。認定書は 1 つのエンティティ (署名者) からのデジタル署名された文書です。それには、あるエンティティの公開鍵には特別な値があることが書かれています。認定書に署名したエンティティを信頼する場合、認定書で、指定の公開鍵と他の特定のエンティティの間の関係は本物であると信頼します。 javakey は現在、X.509 の認定書を処理します。このセクションの後半の例は、X.509 の認定書に関連しています。

認定書の生成

認定書を生成するために、ユーザが情報を提供するファイルを最初に作成します。

-gc オプションを使用して、認定書を生成します。また、ファイルの指定は、次のとおりです。
    javakey -gc dukeCertDirFile

javakey は、提供された情報により、ディレクティブファイルに認定書を作成します。また、その鍵を証明するエンティティの公開鍵や発行者の秘密鍵 (認定書に署名するために必要) など、データベースに格納された情報を使用します。

認定書ディレクティブファイルの例を次に示し、引数の説明をします。

#
# Information about the issuer (required).
#
issuer.name=jsmith

#
# The certificate to use for the signing (required if this is not self-signed).
#
issuer.cert=1

#
# Information about the subject (required).
#
subject.name=mlaunay
subject.real.name=Marie Launay
subject.org.unit=JavaSoft
subject.org=Sun MicroSystems
subject.country=Switzerland

#
# Information about the certificate (required).
#
start.date=1 Jan 1997
end.date=15 Jan 1997
serial.number=1001

#
# Signature algorithm to be used (only required if you don't want DSA used).
#
signature.algorithm=MD5/RSA

#
# Name of the file to which to save a copy of the certificate (optional).
#
out.file=cert.cer

認定書のディレクティブファイル引数は、別途指定がない限り、すべてに必要です。

issuer.namesubject.name
データベースのユーザ名。issuer.name は認定書に署名し、発行する署名者の名前です。subject.name は、その鍵が認定書の発行により、認証されるエンティティ (アイデンティティまたは署名者) の名前です。
issuer.cert
発行者の認定書のうち、どれを認定ファイルの署名のために使うかを指定し、それにより主体の公開鍵を認証します。その値は、認定書が生成されたとき (またはインポートされたとき)、javakeyが発行者の認定書に、以前に代入した番号でなければなりません。javakey が認定書に代入した番号を、 -ld オプションまたは -li javakey オプションの出力表示により、調べることができます。注意: この issuer.cert プロパティは、生成された認定書が自己署名でない場合のみ、要求されます(自己署名認定書はissuer.namesubject.nameが同じ場合の認定書)。
subject.real.name, subject.org.unit, subject.org, and subject.country
X.500 の識別名コンポーネント。このようなコンポーネントは、主体の一般的名前、組織単位および国をそれぞれ参照します。
start.dateend.date
このような文字列で、認定書の有効開始日と満期 (時刻はオプション) を指定します。認定書は開始日付の時刻から終了日付の時刻まで有効です。開始および終了文字列は、String 引数をとる java.util.Date メソッドが認可する文字列であれば可能です。日付に指定時刻がない場合は、指定日の開始時刻と解釈されます。
serial.number
シリアルナンバー。特定の発行者にとって、この数字はこの発行者が署名した認定書とその他の認定書を区別するため、一意的のものでなければなりません。
signature.algorithm
認定書の署名に使用される署名アルゴリズムの名前。 この引数はオプションです。signature.algorithm の指定がない場合には、 DSA (デジタル署名アルゴリズム) が使用されます。その場合には、署名者の秘密鍵と公開鍵は DSA アルゴリズムに対応するものでなければなりません。非 DSA アルゴリズムは、(1) 指定の名前が標準アルゴリズム名である場合、 (2) 静的にインストールされているプロバイダが、そのアルゴリズムに対して実装を供給する場合、および (3) 署名者の鍵が指定のアルゴリズムに適切である場合に限り使用することができます。たとえば、signature.algorithm プロパティの値が、MD5/RSA または SHA-1/RSA である場合には、署名者の鍵は RSA 鍵でなければなりません。
out.file
認定書を保存するファイル名。この引数はオプションです。

認定書とファイル

javakey を使用して、ファイルとして格納された認定書の表示、インポートおよびエクスポートが可能です。 ファイルに格納された認定書を表示するには、-dc オプションを使用します。たとえば、次のとおりです。

    javakey -dc certfile.cer

これは、 certfile.cer ファイルに格納された認定書に関する情報を表示します。たとえば、次のとおりです。

ファイルから認定書をインポートするには、-ic オプションを使用して次のようにします。
    javakey -ic joe jcertfile.cer
このサンプルコマンドは、ファイル jcertfile.cer に認定書をインポートして、joe と関連付けます。

ファイルから認定書をエクスポートするには、-ec オプションを使用して次のようにします。

    javakey -ec jane 2 janecertfile.cer
このサンプルコマンドは、jane の認定書 #2 をファイル janecertfile.cer にエクスポートします。認定書の数字は、認定書が生成されたとき (またはインポートされたとき)、 javakey が以前に代入した数字でなければなりません。javakeyが認定書に代入した数字を、 -ld または -li javakey オプションの出力表示により、調べることができます。

JAR ファイルとデジタル署名

Java Archive ファイル (JAR ファイル) は JDK1.1 の新しい機能です。この機能は、転送を速く、容易にするために、クラスファイル、イメージ、サウンドおよびその他のデジタルデータを 1 つのファイルにパッケージすることを可能にします。JDK1.1 には、プログラム開発者が JAR ファイルを作成できるように、jar というツールが入っています。

javakey は、JAR ファイルに署名し、証明するために使用します(注意: 証明はまだ実装されていません)。 Java のライセンスを受ける人は、javakey を使用して署名を生成することを重要視することを前提としています。

この時点で、javakey は、 DSA (デジタル署名アルゴリズム) を使用するか、場合によっては MD5/RSA アルゴリズムを使用するかして JAR ファイルに署名することができます。すなわち、署名者の公開鍵と秘密鍵が DSA 鍵である場合には、javakey が、 DSA を使用して JAR ファイルに署名します。署名者の鍵が RSA 鍵である場合には、 javakey は、MD/RSA アルゴリズムを使用して JAR ファイルに署名しようとします。これは、静的にインストールされている プロバイダが存在して、 MD5/RSA アルゴリズムの実装を供給する場合に限り可能です。

DSA と MD5/RSA アルゴリズムの両方に対して、ファイルに署名したい場合には、誰でも公開鍵と秘密鍵の両方を持つ必要があります。秘密鍵の署名に使用し、公開鍵の認定書がその署名ファイル中に含まれます (PKCS #7 ブロック内)。

JAR ファイル署名

JAR ファイルに署名することは、指定の署名者の署名を生成することや、指定のJAR ファイルにその署名を含ませることを意味しています。javakeyが管理するデータベースには、署名者、関連するペアの鍵および最低 1 つの X.509 認定書があるものとされます。認定書の生成のように、署名の生成はディレクティブベースです。各ディレクティブファイルには署名者の profile が含まれます。サンプルのディレクティブファイルでは次のようになります。


#
# JAR signing directive. This is the directive file used by javakey to 
# sign a JAR file.
#

# Which signer to use. This signer must be in the database.

signer=duke


# Certificate number to use for this signer. This determines which
# certificate will be included in the PKCS#7 block. This is mandatory
# and is 1-based. Its value should be the number that javakey
# previously assigned to the signer's certificate when it generated it 
# (or imported it). You can see which numbers javakey assigns 
# to certificates by viewing the output of the 
# -ld or -li javakey option. 

cert=1


# Certificate chain depth of a chain of certificates to include. This is
# currently not supported.

chain=0

# The name to give to the generated signature file and associated signature
# block. This must be 8 characters or less.
# The generated signature file and associated signature block will have 
# this name, with the .SF and .DSA extensions, respectively.
# In this example, the files will be DUKESIGN.SF and DUKESIGN.DSA.

signature.file=DUKESIGN


# (Optional) The name to give to the signed JAR file.

out.file=signedJar.jar

一度、JAR ファイルやディレクティブファイルが作成されると、javakey コマンドを使用してJAR ファイルに署名します。それは、次のようになります。

    javakey -gs directivefile jarfile
directivefile はディレクティブファイルの名前 (とパス) です。jarfile はJAR ファイルの名前 (とパス) です。

このコマンドの出力は署名済みの JAR ファイルで、そのファイル名は out.file プロパティの値で指定した名前となります。必要があれば、ディレクティブファイルに指定します。out.file プロパティがない場合、署名される JAR ファイル名は最初の JAR ファイルの名前と同じになりますが、サフィックスの .sig が付きます。

生成された .SF と .DSA ファイルは、META-INF ディレクトリの JAR ファイルに追加されます。これらのファイルの基本名が、前記の例のように DUKESIGN の場合、追加ファイルは次のとおりです。

署名入り JAR ファイルの中で、このような名前のファイルは上書きされます。

オプション

注意: 前にあるマイナスサイン (-) があってもなくても、オプションを指定することができます。1つの オプションだけが javakey コマンドで指定することができます。
-c identity {true|false}
データベースのユーザ名 identity で新しいアイデンティティを作成します。オプションの truefalse の指定は、信頼できるアイデンティティであるかどうかを指定します(デフォルトは false )。 たとえば、アイデンティティ名 jane を作成し、彼女が信頼されることを指定するには、次のように行います。

    javakey -c jane true
-cs signer {true|false}
データベースユーザ名 signer で、新しい署名者を作成します。オプションの truefalse 指定は、その署名者が信頼できるかどうかを指定します。

-t idOrSigner {true|false}
指定のアイデンティティまたは署名者のための信頼レベルをセット (またはリセット) します。

-l
javakeyが管理しているデータベースの中の、すべてのエンティティ (アイデンティティと署名者) のユーザ名をリストします。

-ld
javakeyが管理しているデータベースの中の、すべてのエンティティに関する情報を詳細にリストし、提供します。

-li idOrSigner
指定のアイデンティティと署名者に関する情報を詳細に提供します。

-r idOrSigner
データベースから指定のアイデンティティと署名者を削除します。

-ik identity keysrcfile
ファイル keysrcfileの 公開鍵をインポートし、指定の identity と関連付けます。その鍵は X.509 形式でなければなりません。

-ikp signer pubfile privfile
鍵のペア (ファイル pubfileの 公開鍵とファイル privfileの 秘密鍵) をインポートし、指定の signerと関連付けます。その鍵は X.509 形式でなければなりません。

-ic idOrSigner certsrcfile
ファイル certsrcfileの 公開鍵認定書をインポートし、指定のエンティティ (アイデンティティと署名者) と関連付けます。公開鍵がすでに、データベースのエンティティと関連付けられている場合、certsrcfileで証明されている公開鍵と同じであることを javakey が保証します。それが同じでない場合、エラーを報告します。エンティティに関連付けられた公開鍵がまだない場合、javakeycertsrcfileの公開鍵を使用して関連付けます。

-ii idOrSigner
指定のアイデンティティと署名者に関する情報を設定します。「情報インポート」コマンドに次のようにタイプした後、
    javakey -ii jane

janeに提供したい情報を何行かタイプし、行の最後に 1 つのピリオドを打って終了させ、情報の終了を示すよう求められます。

-gk signer algorithm keysize {pubfile} {privfile}
指定の algorithm を使用して、指定の signer に対して、鍵のペア (公開鍵と関連する秘密鍵) を生成し、両方の鍵の長さを keysize ビットにします。ファイル pubfile が指定されている場合、公開鍵はそのファイルに書き込まれます。さらに、ファイル privfile が指定されている場合、秘密鍵もそのファイルに書き込まれます。ここで極めて重要なことは、セキュリティシステムが危険に晒されないように、秘密鍵はプライベートのままにしなければなりません。

アルゴリズムに対する keysize の限界値が、存在する場合には、Java 暗号化アーキテクチャ API 仕様 & 参照付録 B に説明されているものになります。

注:javakey は常に、DSA (デジタル署名アルゴリズム) を生成することができます。javakey が異なるアルゴリズムを生成できるのは、(1) 指定した名前が RSA のような 標準鍵生成アルゴリズム名 である場合、および (2) 静的にインストールされたプロバイダが存在して、指定された鍵生成アルゴリズムの実装を供給する場合に限られます。

DSA アルゴリズムに対する pq、またはg パラメータのようなアルゴリズム固有鍵生成パラメータを指定する方法がないことに注意してください。

-g signer algorithm keysize {pubfile} {privfile}
-gk コマンドのショートカットで、指定の署名者の鍵のペアを生成します。

-gc directivefile
directivefile で提供された情報により、認定書を生成します。認定書の生成 を参照してください。

-dc certfile
ファイル certfile に格納された認定書を表示します。 認定書とファイル を参照してください。

-ec idOrSigner certnum certoutfile
指定の idOrSigner からファイル certoutfile へ、番号を打った認定書 certnum をエクスポートします。その値は、認定書が生成されたとき (またはインポートされたとき)、javakeyが発行者の認定書に、以前に代入した番号でなければなりません。javakeyが認定書に代入した番号を調べるには、-ld (すべてのエンティティ) オプション、または -li (特定のエンティティ) オプションの出力を表示させます。

-ek idOrSigner pubfile {privfile}
指定のアイデンティティまたは署名者のために 公開鍵をエクスポートし、オプションで、秘密鍵 (署名者のために) を指定のファイル (または複数のファイル) にエクスポートします。この鍵は、X.509/DER 形式でコード化します。

-gs directivefile jarfile
directivefile で提供される情報に従い、指定の JAR (Java ARchive) ファイルに署名します。 JAR ファイルとデジタル署名 を参照してください。

jane という名の信頼されるアイデンティティと joe という名の信頼される署名者を作成するには、次のコマンドを使用してください。
    javakey -c jane true
    javakey -cs joe true

jane が電子メールで、彼女の公開鍵を joe に送り、彼が\tmp\jane_pubkey という名前のファイルにその鍵を格納していると仮定します。それは、X.509/DER 形式でコード化されていなければなりません。その鍵をインポートし、javakey が管理する持続データベースの中にある janeのアイデンティティと関連付けるには、joe (またはシステム管理者) が次のコマンドを入力します。

    javakey -ik jane \tmp\jane_pubkey

joe が、別のコンテキストで使用した公開鍵と秘密鍵をペアでもっていると仮定してみましょう。今彼は、データベースの中にある自分のユーザ名識別子と、その鍵のペアを関連付けようとします。その公開鍵は \tmp\joe_pubkey に格納されており、その秘密鍵は \tmp\joe_privkey に格納されていると仮定して、彼が行うコマンドは、次のようになります。

    javakey -ikp joe \tmp\joe_pubkey \tmp\joe_privkey

2 つの鍵は X.509 形式でなければなりません。当然、2 つの鍵は同じアルゴリズムで書かれています。

既存のペアの鍵の代わりに joe の新しいペアの鍵を作るために、使用するコマンドは次のとおりです。

    javakey -gk joe DSA 512 \tmp\joe_pubkey

このコマンドにより、512 ビットの DSA のペア鍵が作成され、joe と関連付けられます。-gk もまた、オプションで、ファイルに公開鍵のコピーを保存します。この例では、\tmp\joe_pubkey ファイルを使用しています。joeがファイルに 公開鍵を保存する理由として、jane にその鍵のコピーをメールで送ることができるし、また、その鍵を必要としている (すなわちjoeのデジタルシグネチャを証明する) 誰か他の人に、メールで送ることもできます。このコマンドは、オプションの必要があれば 秘密鍵を保存するファイルを joe に指定させることもできます。しかし、秘密鍵をファイルへ保存することについては十分注意する必要があります。

joe がファイルに署名する前に、1 つ以上の自分と関連付ける認定書をもち、自分の 公開鍵を認証しなければなりません。自分の認定書を生成するには、ディレクティブファイルをまず作成する必要があります。そのファイルに、joe、認定書発行者および認定書有効日などに関するさまざまな情報を指定します。そのようなファイルが作成され ( 認定書 を参照してください)、そのファイルの名前は joeCertDirectiveFile で、\tmp\ ディレクトリにあると仮定します。joe の認定書が作成されるときのコマンドは、次のようになります。

    javakey -gc \tmp\joeCertDirectiveFile
JAR ファイルとデジタル署名 で説明したように、署名入り JAR ファイルも、署名が要求する情報を提供するディレクティブファイルが必要になります。そのような情報は署名者の名前やその署名に使われる認定書の番号などです。jarfileA.jar という名前の JAR ファイルに署名するコマンドは、 joeJarDirectiveFile ディレクティブファイルを使用して、次のようになります。
    javakey -gs joeJarDirectiveFile jarfileA.jar

参照