モジュール java.base
パッケージ java.security

クラスKeyStore

java.lang.Object
java.security.KeyStore

public class KeyStore extends Object
このクラスは、暗号化のキーと証明書の格納場所を表現したものです。

KeyStoreは異なるタイプのエントリを管理します。 個々のエントリ・タイプはKeyStore.Entryインタフェースを実装します。 次の3つの基本KeyStore.Entry実装が提供されています。

  • KeyStore.PrivateKeyEntry

    このタイプのエントリには暗号化PrivateKeyが格納されます。許可されないアクセスを防ぐために保護形式で格納できるようになっています。 また、対応する公開キーの証明書チェーンもいっしょに格納されます。

    秘密キーおよび証明書チェーンは、自動認証のための指定されたエンティティによって使用されます。 この認証が利用されるのは、ソフトウェア配布組織がソフトウェアのリリースやライセンス供与の一貫としてJARファイルに署名する場合などです。

  • KeyStore.SecretKeyEntry

    このタイプのエントリには暗号化SecretKeyが格納されます。許可されないアクセスを防ぐために保護形式で格納できるようになっています。

  • KeyStore.TrustedCertificateEntry

    このタイプのエントリには別の組織に属する単一の公開キーCertificateが格納されます。 これは信頼できる証明書と呼ばれますが、それは、キーストアの所有者が、証明書内の公開キーが実際に証明書のサブジェクト (所有者)によって識別されたアイデンティティに属することを信頼するためです。

    このタイプのエントリは、他の相手を認証するのに使用できます。

キーストア内の各エントリは、「別名」文字列によって識別されます。 秘密キーとそれに関連付けられた証明書チェーンの場合は、これらの文字列はエンティティ自体が認証するというように、方法別に区別されます。 たとえば、エンティティが異なる証明書発行局を使ったり、異なる公開キー・アルゴリズムを使ったりして、エンティティ自体を認証することも可能です。

別名で大文字と小文字が区別されるかどうかは、実装に依存します。 問題の発生を防ぐため、KeyStore内では、大文字と小文字の区別が異なるだけの別名を使用しないようにしてください。

キーストアが持続性があるかどうか、および持続性がある場合に使われるメカニズムは、ここでは指定されません。 これにより、重要な(秘密または非公開)キーを保護するためのさまざまな技術を使うことができます。 スマート・カードまたはその他の統合暗号化エンジン(SafeKeyper)を使うことも1つの方法です。また、ファイルなどのより単純なメカニズムを様々な形式で使うこともできます。

KeyStoreオブジェクトをリクエストする一般的な方法は、既存のキーストア・ファイルの指定、デフォルト・タイプに依存し、特定のキーストア・タイプの指定です。

  • 既存のキーストア・ファイルを指定するには:
        // get keystore password
        char[] password = getPassword();
    
        // probe the keystore file and load the keystore entries
        KeyStore ks = KeyStore.getInstance(new File("keyStoreName"), password);
    
    システムは、指定されたファイルを検証して、そのキーストア・タイプを確認し、エントリがすでにロードされているキーストア実装を返します。 この方法を使用する場合、キーストアのloadメソッドをコールする必要はありません。
  • デフォルトのタイプを利用するには:
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
     
    システムは、デフォルト・タイプのキーストア実装を返します。
  • 特定のキーストア・タイプを指定するには:
          KeyStore ks = KeyStore.getInstance("JKS");
     
    システムは、環境内で利用可能な実装のうち、指定されたキーストア・タイプにもっとも適したものを返します。

キーストアにアクセスするには、loaded (インスタンシエーション中に既にロードされていない限り)である必要があります。

    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

    // get user password and file input stream
    char[] password = getPassword();

    try (FileInputStream fis = new FileInputStream("keyStoreName")) {
        ks.load(fis, password);
    }
 
上記のloadメソッドを使って空のキーストアを作成するには、InputStream引数としてnullを渡します。

キーストアのロードが完了すると、既存のエントリをキーストアから読み取ったり、新しいエントリをキーストアに書き込んだりできます。

    KeyStore.PasswordProtection protParam =
        new KeyStore.PasswordProtection(password);
    try (FileOutputStream fos = new FileOutputStream("newKeyStoreName")) {
        // get my private key
        KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
            ks.getEntry("privateKeyAlias", protParam);
        PrivateKey myPrivateKey = pkEntry.getPrivateKey();

        // save my secret key
        javax.crypto.SecretKey mySecretKey;
        KeyStore.SecretKeyEntry skEntry =
            new KeyStore.SecretKeyEntry(mySecretKey);
        ks.setEntry("secretKeyAlias", skEntry, protParam);

        // store away the keystore
        ks.store(fos, password);
    } finally {
        protParam.destroy();
    }
 
なお、上記サンプル・コードで示したように、キーストアのロード、非公開キーエントリの保護、秘密キーエントリの保護、およびキーストアの格納には同じパスワードを使用できますが、異なるパスワードやその他の保護パラメータも使用できます。

Javaプラットフォームの実装は、すべて次の標準のKeyStoreタイプをサポートする必要があります。

  • PKCS12
このタイプについては、Javaセキュリティ標準アルゴリズム名仕様の「KeyStoreセクション」を参照してください。 サポートされているその他のタイプについては、実装のリリース・ノートを参照してください。

導入されたバージョン:
1.2
関連項目: