public class KeyStore

extends Object

此类表示密钥和证书的存储设施。

KeyStore管理不同类型的条目。每种类型的条目都实现KeyStore.Entry接口。提供了三种基本的KeyStore.Entry实现:

KeyStore.PrivateKeyEntry

此类型的条目保存一个加密的PrivateKey,可以选择用受保护格式存储该私钥,以防止未授权访问。它还随附一个相应公钥的证书链。

给定条目使用私钥和证书链进行自验证(self-authentication)。应用此验证的包括软件发布组织,它们将JAR文件签名为发布和/或许可软件的一部分。

KeyStore.SecretKeyEntry

此类型的条目保存一个加密的SecretKey,可以选择用受保护格式存储该密钥,以防止未授权访问。

KeyStore.TrustedCertificateEntry

此类型的条目包含一个属于另一方的单个公钥Certificate。它被称为可信证书,因为keystore的所有者相信证书中的公钥确实属于该证书的 subject(所有者)所标识的身份。

此类型的条目可用于验证其他方。

KeyStore中的每一条目都用“alias”字符串标识。对于私钥及其关联的证书链,这些字符串用于区分实体验证自身可以采用的不同方式。例如,实体可以使用不同的证书授权或不同的公钥算法来验证自身。

别名是否区分大小写与实现有关。为了避免出现问题,建议不要在KeyStore中使用只有大小写区别的别名。

在这里没有指定keystore是否是持久性的,也没有指定keystore是持久性时所使用的机制。这允许使用各种技术保护敏感的(例如,私有的或秘密的)密钥。一种选择是使用智能卡或其他集成加密引擎(SafeKeyper),也可以(以各种格式)使用文件之类更为简单的机制。

请求KeyStore对象的典型方式包括使用默认类型和提供一个特定的keystore类型。

使用默认类型:

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

系统将返回默认类型的keystore实现。

提供特定的keystore类型:

·KeyStore ks = KeyStore.getInstance("JKS");

系统将返回环境中可用的指定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(如上文示例代码所示),也可以使用不同的密码或其他保护参数。

例子

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.security.InvalidKeyException;

import java.security.KeyStore;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.PrivateKey;

import java.security.SignatureException;

import java.security.UnrecoverableKeyException;

import java.security.cert.Certificate;

import java.security.cert.CertificateException;

import java.security.cert.CertificateFactory;

public class KeyReader {

public static void main(String[] args) throws KeyStoreException,

NoSuchProviderException, NoSuchAlgorithmException,

CertificateException, IOException, UnrecoverableKeyException,

InvalidKeyException, SignatureException {

// Open an input stream on the keystore file

String cerFileName = "d:/certA.cer";

String p12FileName = "d:/certA.p12";

String pfxPassword = "openssl";

InputStream fis = new FileInputStream(p12FileName);

// Create a keystore object

KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");

// Load the file into the keystore

keyStore.load(fis, pfxPassword.toCharArray());

String aliaesName = "abcd";

PrivateKey priKey = (PrivateKey) (keyStore.getKey(aliaesName, null));

System.out.println("private key:/n" + priKey);

// public key

InputStream is = new FileInputStream(cerFileName);

CertificateFactory cf = CertificateFactory.getInstance("x509");

Certificate cerCert = cf.generateCertificate(is);

System.out.println("public key:/n" + cerCert);

}

}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐