JavaTM 2 Platform
Standard Ed. 6

java.security
類別 KeyStore

java.lang.Object
  繼承者 java.security.KeyStore

public class KeyStore
extends Object

此類別表示密鑰和證書的存儲設施。

KeyStore 管理不同型別的條目。每種型別的條目都實作 KeyStore.Entry 介面。提供了三種基本的 KeyStore.Entry 實作:

KeyStore 中的每一條目都用 “alias” 字元串標識。對於私鑰及其關聯的證書鏈,這些字元串用於區分實體驗證自身可以採用的不同方式。例如,實體可以使用不同的證書授權或不同的公鑰演算法來驗證自身。

別名是否區分大小寫與實作有關。為了避免出現問題,建議不要在 KeyStore 中使用只有大小寫區別的別名。

在這裡沒有指定 keystore 是否是持久性的,也沒有指定 keystore 是持久性時所使用的機制。這允許使用各種技術保護敏感的(例如,私有的或秘密的)密鑰。一種選擇是使用智能卡或其他集成加密引擎 (SafeKeyper),也可以(以各種格式)使用檔案之類別更為簡單的機制。

請求 KeyStore 物件的典型方式包括使用預設型別和提供一個特定的 keystore 型別。

必須先載入 keystore 才能對其進行存取。

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

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

    java.io.FileInputStream fis = null;
    try {
        fis = new java.io.FileInputStream("keyStoreName");
        ks.load(fis, password);
    } finally {
        if (fis != null) {
            fis.close();
        }
    }
 
要使用上述 load 方法創建一個空 keystore,傳遞 null 作為 InputStream 的參數。

一旦載入了 keystore,就能夠從 keystore 讀取現有條目,或向 keystore 寫入新條目:

    // get my private key
    KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
        ks.getEntry("privateKeyAlias", password);
    PrivateKey myPrivateKey = pkEntry.getPrivateKey();

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

    // store away the keystore
    java.io.FileOutputStream fos = null;
    try {
        fos = new java.io.FileOutputStream("newKeyStoreName");
        ks.store(fos, password);
    } finally {
        if (fos != null) {
            fos.close();
        }
    }
 
注意,可以使用相同的密碼載入 keystore、保護私鑰條目、保護秘密密鑰條目以及存儲 keystore(如上文範例程式碼所示),也可以使用不同的密碼或其他保護參數。

從以下版本開始:
1.2
另請參見:
PrivateKey, SecretKey, Certificate

巢狀類別摘要
static class KeyStore.Builder
          將被實例化的 KeyStore 物件的描述。
static class KeyStore.CallbackHandlerProtection
          封裝 CallbackHandler 的 ProtectionParameter。
static interface KeyStore.Entry
          用於 KeyStore 項型別的標記介面。
static interface KeyStore.LoadStoreParameter
          用於 KeyStore loadstore 參數的標記介面。
static class KeyStore.PasswordProtection
          ProtectionParameter 的一個基於密碼的實作。
static class KeyStore.PrivateKeyEntry
          保存 PrivateKey 和相應證書鏈的 KeyStore 項。
static interface KeyStore.ProtectionParameter
          用於 keystore 保護參數的標記介面。
static class KeyStore.SecretKeyEntry
          保存 SecretKeyKeyStore 項。
static class KeyStore.TrustedCertificateEntry
          保存可信的 CertificateKeyStore 項。
 
建構子摘要
protected KeyStore(KeyStoreSpi keyStoreSpi, Provider provider, String type)
          創建給定型別的 KeyStore 物件,並在其中封裝給定的提供者實作(SPI 物件)。
 
方法摘要
 Enumeration<String> aliases()
          列出此 keystore 的所有別名。
 boolean containsAlias(String alias)
          檢查給定別名是否存在於此 keystore 中。
 void deleteEntry(String alias)
          刪除此 keystore 中給定別名標識的條目。
 boolean entryInstanceOf(String alias, Class<? extends KeyStore.Entry> entryClass)
          確定指定 alias 的 keystore Entry 是否是指定 entryClass 的實例或子類別。
 Certificate getCertificate(String alias)
          返回與給定別名關聯的證書。
 String getCertificateAlias(Certificate cert)
          返回證書與給定證書比對的第一個 keystore 條目的別名。
 Certificate[] getCertificateChain(String alias)
          返回與給定別名關聯的證書鏈。
 Date getCreationDate(String alias)
          返回給定別名標識的條目的創建日期。
static String getDefaultType()
          返回 Java 安全屬性檔案中指定的預設 keystore 型別;如果不存在此類別屬性,則返回字元串 "jks"("Java keystore" 的首字母縮寫)。
 KeyStore.Entry getEntry(String alias, KeyStore.ProtectionParameter protParam)
          使用指定保護參數獲取指定別名的 keystore Entry
static KeyStore getInstance(String type)
          返回指定型別的 keystore 物件。
static KeyStore getInstance(String type, Provider provider)
          返回指定型別的 keystore 物件。
static KeyStore getInstance(String type, String provider)
          返回指定型別的 keystore 物件。
 Key getKey(String alias, char[] password)
          返回與給定別名關聯的密鑰,並用給定密碼來恢復它。
 Provider getProvider()
          返回此 keystore 的提供者。
 String getType()
          返回此 keystore 的型別。
 boolean isCertificateEntry(String alias)
          如果給定別名標識的條目是通過調用 setCertificateEntry 或者以 TrustedCertificateEntry 為參數的 setEntry 創建的,則返回 true。
 boolean isKeyEntry(String alias)
          如果給定別名標識的條目是通過調用 setKeyEntry 或者以 PrivateKeyEntrySecretKeyEntry 為參數的 setEntry 創建的,則返回 true。
 void load(InputStream stream, char[] password)
          從給定輸入串流中載入此 KeyStore。
 void load(KeyStore.LoadStoreParameter param)
          使用給定 LoadStoreParameter 載入此 keystore。
 void setCertificateEntry(String alias, Certificate cert)
          將給定可信證書分派給給定別名。
 void setEntry(String alias, KeyStore.Entry entry, KeyStore.ProtectionParameter protParam)
          用指定別名保存 keystore Entry
 void setKeyEntry(String alias, byte[] key, Certificate[] chain)
          將給定密鑰(已經被保護)分派給給定別名。
 void setKeyEntry(String alias, Key key, char[] password, Certificate[] chain)
          將給定的密鑰分派給給定的別名,並用給定密碼保護它。
 int size()
          獲取此 keystore 中條目數。
 void store(KeyStore.LoadStoreParameter param)
          使用給定 LoadStoreParameter 存儲此 keystore。
 void store(OutputStream stream, char[] password)
          將此 keystore 存儲到給定輸出串流,並用給定密碼保護其完整性。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

KeyStore

protected KeyStore(KeyStoreSpi keyStoreSpi,
                   Provider provider,
                   String type)
創建給定型別的 KeyStore 物件,並在其中封裝給定的提供者實作(SPI 物件)。

參數:
keyStoreSpi - 提供者實作
provider - 提供者
type - keystore 型別。
方法詳細資訊

getInstance

public static KeyStore getInstance(String type)
                            throws KeyStoreException
返回指定型別的 keystore 物件。

此方法從首選 Provider 開始遍歷已註冊安全提供者列表。返回一個封裝 KeyStoreSpi 實作的新 KeyStore 物件,該實作取自第一個支持指定型別的 Provider。

注意,可以通過 Security.getProviders() 方法獲取已註冊提供者列表。

參數:
type - keystore 型別。有關標準 keystore 型別的資訊,請參閱 Java Cryptography Architecture API Specification & Reference 中的附錄 A。
返回:
指定型別的 keystore 物件。
拋出:
KeyStoreException - 如果沒有 Provider 支持指定型別的 KeyStoreSpi 實作。
另請參見:
Provider

getInstance

public static KeyStore getInstance(String type,
                                   String provider)
                            throws KeyStoreException,
                                   NoSuchProviderException
返回指定型別的 keystore 物件。

返回一個封裝 KeyStoreSpi 實作的新 KeyStore 物件,該實作取自指定提供者。指定提供者必須在安全提供者列表中註冊。

注意,可以通過 Security.getProviders() 方法獲取已註冊提供者列表。

參數:
type - keystore 型別。有關標準 keystore 型別的資訊,請參閱 Java Cryptography Architecture API Specification & Reference 中的附錄 A。
provider - 提供者的名稱。
返回:
指定型別的 keystore 物件。
拋出:
KeyStoreException - 如果不能從指定提供者獲得指定型別的 KeyStoreSpi 實作。
NoSuchProviderException - 如果指定提供者未在安全提供者列表中註冊。
IllegalArgumentException - 如果提供者的名稱為 null 或空。
另請參見:
Provider

getInstance

public static KeyStore getInstance(String type,
                                   Provider provider)
                            throws KeyStoreException
返回指定型別的 keystore 物件。

返回一個封裝 KeyStoreSpi 實作的新 KeyStore 物件,該實作取自指定 Provider 物件。注意,指定 Provider 物件無需在提供者列表中註冊。

參數:
type - keystore 型別。有關標準 keystore 型別的資訊,請參閱 Java Cryptography Architecture API Specification & Reference 中的附錄 A。
provider - 提供者。
返回:
指定型別的 keystore 物件。
拋出:
KeyStoreException - 如果不能從指定 Provider 物件獲得指定型別的 KeyStoreSpi 實作。
IllegalArgumentException - 如果指定提供者為 null。
從以下版本開始:
1.4
另請參見:
Provider

getDefaultType

public static final String getDefaultType()
返回 Java 安全屬性檔案中指定的預設 keystore 型別;如果不存在此類別屬性,則返回字元串 "jks"("Java keystore" 的首字母縮寫)。Java 安全屬性檔案位於名為 <JAVA_HOME>/lib/security/java.security 的檔案中。<JAVA_HOME> 參考 java.home 系統屬性的值,並指定安裝 JRE 的目錄。

調用某個 getInstance 方法時不希望使用固定編碼 (hard coded) keystore 型別的應用程序,以及使用者未指定 keystore 型別時希望提供預設 keystore 型別的應用程序可以使用預設的 keystore 型別。

通過將 "keystore.type" 安全屬性(在 Java 安全屬性檔案中)的值設置為所需的 keystore 型別,可以更改預設的 keystore 型別。

返回:
Java 安全屬性檔案中指定的預設 keystore 型別;如果不存在此類別屬性,則返回字元串 "jks"。

getProvider

public final Provider getProvider()
返回此 keystore 的提供者。

返回:
此 keystore 的提供者。

getType

public final String getType()
返回此 keystore 的型別。

返回:
此 keystore 的型別。

getKey

public final Key getKey(String alias,
                        char[] password)
                 throws KeyStoreException,
                        NoSuchAlgorithmException,
                        UnrecoverableKeyException
返回與給定別名關聯的密鑰,並用給定密碼來恢復它。必須已經通過調用 setKeyEntry,或者以 PrivateKeyEntrySecretKeyEntry 為參數的 setEntry 關聯密鑰與別名。

參數:
alias - 別名
password - 用於恢復密鑰的密碼
返回:
請求的密鑰;如果給定別名不存在或不標識與密鑰相關的條目,則返回 null。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。
NoSuchAlgorithmException - 如果不能找到恢復密鑰的演算法
UnrecoverableKeyException - 如果不能恢復密鑰(例如,給定密碼錯誤)。

getCertificateChain

public final Certificate[] getCertificateChain(String alias)
                                        throws KeyStoreException
返回與給定別名關聯的證書鏈。必須已經通過調用 setKeyEntry,或者以 PrivateKeyEntry 為參數的 setEntry 關聯證書鏈與別名。

參數:
alias - 別名
返回:
證書鏈(按使用者證書在前,根證書授權在後的順序);如果給定別名不存在或不包含證書鏈,則返回 null
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

getCertificate

public final Certificate getCertificate(String alias)
                                 throws KeyStoreException
返回與給定別名關聯的證書。

如果給定的別名標識通過調用 setCertificateEntry 創建的條目,或者通過調用以 TrustedCertificateEntry 為參數的 setEntry 創建的條目,則返回包含在該條目中的可信證書。

如果給定的別名標識通過調用 setKeyEntry 創建的條目,或者通過調用以 PrivateKeyEntry 為參數的 setEntry 創建的條目,則返回該條目中證書鏈的第一個元素。

參數:
alias - 別名
返回:
證書;如果給定別名不存在或不包含證書,則返回 null。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

getCreationDate

public final Date getCreationDate(String alias)
                           throws KeyStoreException
返回給定別名標識的條目的創建日期。

參數:
alias - 別名
返回:
此條目的創建日期;如果給定的別名不存在,則返回 null
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

setKeyEntry

public final void setKeyEntry(String alias,
                              Key key,
                              char[] password,
                              Certificate[] chain)
                       throws KeyStoreException
將給定的密鑰分派給給定的別名,並用給定密碼保護它。

如果給定密鑰的型別為 java.security.PrivateKey,則它必須附帶證明相應公鑰的證書鏈。

如果給定別名已經存在,則與別名關聯的 keystore 資訊將被給定密鑰(還可能包括證書鏈)覆寫。

參數:
alias - 別名
key - 要與別名關聯的密鑰
password - 保護密鑰的密碼
chain - 相應公鑰的證書鏈(只在給定密鑰的型別為 java.security.PrivateKey 時需要)。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)、無法保護給定的密鑰,或者此操作由於某些其他原因而失敗

setKeyEntry

public final void setKeyEntry(String alias,
                              byte[] key,
                              Certificate[] chain)
                       throws KeyStoreException
將給定密鑰(已經被保護)分派給給定別名。

如果受保護密鑰的型別為 java.security.PrivateKey,則它必須附帶證明相應公鑰的證書鏈。如果底層 keystore 實作的型別為 jks,則必須根據 PKCS #8 標準中的定義將 key 編碼為 EncryptedPrivateKeyInfo

如果給定別名已經存在,則與別名關聯的 keystore 資訊將被給定密鑰(還可能包括證書鏈)覆寫。

參數:
alias - 別名
key - 要與別名關聯的密鑰(以受保護格式)
chain - 相應公鑰的證書鏈(只在受保護密鑰的型別為 java.security.PrivateKey 時有用)。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入),或者此操作由於某些其他原因而失敗。

setCertificateEntry

public final void setCertificateEntry(String alias,
                                      Certificate cert)
                               throws KeyStoreException
將給定可信證書分派給給定別名。

如果給定別名標識通過調用 setCertificateEntry 創建的現有條目,或者通過調用以 TrustedCertificateEntry 為參數的 setEntry 創建的現有條目,則現有條目中的可信證書將被給定證書覆寫。

參數:
alias - 別名
cert - 證書
拋出:
KeyStoreException - 如果 keystore 尚未被初始化,或者給定別名已存在但不標識包含可信證書的條目,或者此操作由於其他某些原因失敗。

deleteEntry

public final void deleteEntry(String alias)
                       throws KeyStoreException
刪除此 keystore 中給定別名標識的條目。

參數:
alias - 別名
拋出:
KeyStoreException - 如果 keystore 尚未被初始化,或者條目不能被移除。

aliases

public final Enumeration<String> aliases()
                                  throws KeyStoreException
列出此 keystore 的所有別名。

返回:
別名的列舉
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

containsAlias

public final boolean containsAlias(String alias)
                            throws KeyStoreException
檢查給定別名是否存在於此 keystore 中。

參數:
alias - 別名
返回:
如果別名存在,則返回 true;否則返回 false
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

size

public final int size()
               throws KeyStoreException
獲取此 keystore 中條目數。

返回:
此 keystore 中的條目數
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

isKeyEntry

public final boolean isKeyEntry(String alias)
                         throws KeyStoreException
如果給定別名標識的條目是通過調用 setKeyEntry 或者以 PrivateKeyEntrySecretKeyEntry 為參數的 setEntry 創建的,則返回 true。

參數:
alias - 要檢查的 keystore 條目的別名
返回:
如果給定別名標識的條目是與密鑰相關的條目,則返回 true;否則返回 false。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

isCertificateEntry

public final boolean isCertificateEntry(String alias)
                                 throws KeyStoreException
如果給定別名標識的條目是通過調用 setCertificateEntry 或者以 TrustedCertificateEntry 為參數的 setEntry 創建的,則返回 true。

參數:
alias - 要檢查的 keystore 條目的別名
返回:
如果給定別名標識的條目包含一個可信證書,則返回 true;否則返回 false。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

getCertificateAlias

public final String getCertificateAlias(Certificate cert)
                                 throws KeyStoreException
返回證書與給定證書比對的第一個 keystore 條目的別名。

此方法嘗試將給定證書與每一個 keystore 條目比對。如果認為條目是通過調用 setCertificateEntry 或者以 TrustedCertificateEntry 為參數的 setEntry 創建的,則將給定證書與該條目的證書進行比較。

如果認為條目是通過調用 setKeyEntry 或者以 PrivateKeyEntry 為參數的 setEntry 創建的,則將給定證書與該條目證書鏈的第一個元素進行比較。

參數:
cert - 要比對的證書
返回:
帶有比對證書的第一個條目的別名;如果此 keystore 中不存在這種條目,則返回 null。
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。

store

public final void store(OutputStream stream,
                        char[] password)
                 throws KeyStoreException,
                        IOException,
                        NoSuchAlgorithmException,
                        CertificateException
將此 keystore 存儲到給定輸出串流,並用給定密碼保護其完整性。

參數:
stream - 要寫入此 keystore 的輸出串流。
password - 產生 keystore 完整性檢驗的密碼
拋出:
KeyStoreException - 如果 keystore 尚未被初始化(載入)。
IOException - 如果存在資料 I/O 問題
NoSuchAlgorithmException - 如果不存在恰當的資料完整性演算法
CertificateException - 如果 keystore 資料中包含無法存儲的證書

store

public final void store(KeyStore.LoadStoreParameter param)
                 throws KeyStoreException,
                        IOException,
                        NoSuchAlgorithmException,
                        CertificateException
使用給定 LoadStoreParameter 存儲此 keystore。

參數:
param - 指定如何存儲 keystore 的 LoadStoreParameter,該參數可以為 null
拋出:
IllegalArgumentException - 如果無法識別給定的 LoadStoreParameter 輸入
KeyStoreException - 如果 keystore 尚未被初始化(載入)
IOException - 如果存在資料 I/O 問題
NoSuchAlgorithmException - 如果不存在恰當的資料完整性演算法
CertificateException - 如果 keystore 資料中包含無法存儲的證書
從以下版本開始:
1.5

load

public final void load(InputStream stream,
                       char[] password)
                throws IOException,
                       NoSuchAlgorithmException,
                       CertificateException
從給定輸入串流中載入此 KeyStore。

可以給定一個密碼來解鎖 keystore(例如,駐留在硬體標記設備上的 keystore)或檢驗 keystore 資料的完整性。如果沒有指定用於完整性檢驗的密碼,則不會執行完整性檢驗。

如果要創建空 keystore,或者不能從串流中初始化 keystore,則傳遞 null 作為 stream 的參數。

注意,如果此 keystore 已經被載入,那麼它將被重新初始化,並再次從給定輸入串流中載入。

參數:
stream - 從中載入 keystore 的輸入串流,或者 null
password - 用來檢驗 keystore 完整性的密碼,用來解鎖 keystore 的密碼,或者 null
拋出:
IOException - 如果存在 keystore 資料 I/O 問題或格式問題,如果需要密碼卻沒有指定,或者指定的密碼錯誤。如果錯誤是由於密碼錯誤引起的,那麼 IOExceptioncause 應該是 UnrecoverableKeyException
NoSuchAlgorithmException - 如果不存在用來檢驗 keystore 完整性的演算法
CertificateException - 如果不能載入 keystore 中的任何證書

load

public final void load(KeyStore.LoadStoreParameter param)
                throws IOException,
                       NoSuchAlgorithmException,
                       CertificateException
使用給定 LoadStoreParameter 載入此 keystore。

注意,如果此 KeyStore 已經被載入,那麼它將被重新初始化,並再次從給定參數載入。

參數:
param - 指定如何載入 keystore 的 LoadStoreParameter,可以為 null
拋出:
IllegalArgumentException - 如果無法識別給定 LoadStoreParameter 輸入
IOException - 如果存在 keystore 資料 I/O 問題或格式問題。如果錯誤是由於 ProtectionParameter 不正確(如密碼錯誤)引起的,那麼 IOExceptioncause 應該是 UnrecoverableKeyException
NoSuchAlgorithmException - 如果不存在用來檢驗 keystore 完整性的演算法
CertificateException - 如果不能載入 keystore 中的任何證書
從以下版本開始:
1.5

getEntry

public final KeyStore.Entry getEntry(String alias,
                                     KeyStore.ProtectionParameter protParam)
                              throws NoSuchAlgorithmException,
                                     UnrecoverableEntryException,
                                     KeyStoreException
使用指定保護參數獲取指定別名的 keystore Entry

參數:
alias - 獲取此別名的 keystore Entry
protParam - 用來保護 EntryProtectionParameter,可以為 null
返回:
指定別名的 keystore Entry;如果不存在這種條目,則返回 null
拋出:
NullPointerException - 如果 aliasnull
NoSuchAlgorithmException - 如果不存在用來恢復條目的演算法
UnrecoverableEntryException - 如果指定的 protParam 不足或無效
UnrecoverableKeyException - 如果該條目是 PrivateKeyEntrySecretKeyEntry,並且指定的 protParam 不包含恢復密鑰所需的資訊(如密碼錯誤)
KeyStoreException - 如果 keystore 尚未被初始化(載入)
從以下版本開始:
1.5
另請參見:
setEntry(String, KeyStore.Entry, KeyStore.ProtectionParameter)

setEntry

public final void setEntry(String alias,
                           KeyStore.Entry entry,
                           KeyStore.ProtectionParameter protParam)
                    throws KeyStoreException
用指定別名保存 keystore Entry。保護參數用來保護 Entry

如果指定別名的條目已經存在,它將被覆寫。

參數:
alias - 以此別名保存 keystore Entry
entry - 要保存的 Entry
protParam - 用來保護 EntryProtectionParameter,可以為 null
拋出:
NullPointerException - 如果 aliasentrynull
KeyStoreException - 如果 keystore 尚未被初始化(載入),或者此操作由於其他原因失敗
從以下版本開始:
1.5
另請參見:
getEntry(String, KeyStore.ProtectionParameter)

entryInstanceOf

public final boolean entryInstanceOf(String alias,
                                     Class<? extends KeyStore.Entry> entryClass)
                              throws KeyStoreException
確定指定 alias 的 keystore Entry 是否是指定 entryClass 的實例或子類別。

參數:
alias - 別名
entryClass - 條目的類別
返回:
true 如果指定 alias 的 keystore Entry 是指定 entryClass 的實例或子類別,則返回 true;否則返回 false。
拋出:
NullPointerException - 如果 aliasentryClassnull
KeyStoreException - 如果 keystore 尚未被初始化(載入)
從以下版本開始:
1.5

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only