Java.security
KeyStore
PrivateKey
Signature
java.security.cert
X509Certificate
java.security.KeyStore
概述
public class KeyStore extends Object
此类表示密钥和证书的存储设施。
获取KeyStore
示例代码 获取KeyStore
private static File getCertFile(String path) throws GeneralSecurityException {
File file = new File(CertUtils.class.getClassLoader().getResource(path).getFile());
if (!file.exists()) {
throw new GeneralSecurityException("证书文件不存在:" + path);
}
return file;
}
private static KeyStore getKeyStore(String keyStorePath, String keyStorePwd) throws GeneralSecurityException {
File file = getCertFile(keyStorePath);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream fs = null;
try {
fs = new FileInputStream(file);
ks.load(fs, keyStorePwd.toCharArray());
} catch (IOException ex) {
throw new GeneralSecurityException("获取证书异常");
} finally {
try {
if (fs != null)
fs.close();
} catch (Exception ex) {
}
}
return ks;
}
主要方法
getDefaultType
public static final String getDefaultType()
返回 Java 安全属性文件中指定的默认 keystore 类型;如果不存在此类属性,则返回字符串 “jks”(”Java keystore” 的首字母缩写)。Java 安全属性文件位于名为 /lib/security/java.security 的文件中。 引用 java.home 系统属性的值,并指定安装 JRE 的目录。
调用某个 getInstance 方法时不希望使用固定编码 (hard coded) keystore 类型的应用程序,以及用户未指定 keystore 类型时希望提供默认 keystore 类型的应用程序可以使用默认的 keystore 类型。
通过将 “keystore.type” 安全属性(在 Java 安全属性文件中)的值设置为所需的 keystore 类型,可以更改默认的 keystore 类型。
返回:
Java 安全属性文件中指定的默认 keystore 类型;如果不存在此类属性,则返回字符串 “jks”。
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
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 问题或格式问题,如果需要密码却没有指定,或者指定的密码错误。如果错误是由于密码错误引起的,那么 IOException 的 cause 应该是 UnrecoverableKeyException
NoSuchAlgorithmException - 如果不存在用来检验 keystore 完整性的算法
CertificateException - 如果不能加载 keystore 中的任何证书
getKey
public final Key getKey(String alias,
char[] password)
throws KeyStoreException,
NoSuchAlgorithmException,
UnrecoverableKeyException
返回与给定别名关联的密钥,并用给定密码来恢复它。必须已经通过调用 setKeyEntry,或者以 PrivateKeyEntry 或 SecretKeyEntry 为参数的 setEntry 关联密钥与别名。
参数:
alias - 别名
password - 用于恢复密钥的密码
返回:
请求的密钥;如果给定别名不存在或不标识与密钥相关的条目,则返回 null。
抛出:
KeyStoreException - 如果 keystore 尚未被初始化(加载)。
NoSuchAlgorithmException - 如果不能找到恢复密钥的算法
UnrecoverableKeyException - 如果不能恢复密钥(例如,给定密码错误)。
getCertificate
public final Certificate getCertificate(String alias)
throws KeyStoreException
返回与给定别名关联的证书。
如果给定的别名标识通过调用 setCertificateEntry 创建的条目,或者通过调用以 TrustedCertificateEntry 为参数的 setEntry 创建的条目,则返回包含在该条目中的可信证书。
如果给定的别名标识通过调用 setKeyEntry 创建的条目,或者通过调用以 PrivateKeyEntry 为参数的 setEntry 创建的条目,则返回该条目中证书链的第一个元素。
参数:
alias - 别名
返回:
证书;如果给定别名不存在或不包含证书,则返回 null。
抛出:
KeyStoreException - 如果 keystore 尚未被初始化(加载)。
接口java.security.PrivateKey
概述
java.security
接口 PrivateKey
所有超级接口:
Key, Serializable
所有已知子接口:
DHPrivateKey, DSAPrivateKey, ECPrivateKey, RSAMultiPrimePrivateCrtKey, RSAPrivateCrtKey, RSAPrivateKey
public interface PrivateKeyextends Key
私钥。此接口不包含任何方法或常量。它仅用于将所有私钥接口分组(并为其提供类型安全)。 注:特定的私钥接口扩展此接口。请参见(例如)java.security.interfaces 中的 DSAPrivateKey 接口。
java.security.Signature
概述
此 Signature 类用来为应用程序提供数字签名算法功能。数字签名用于确保数字数据的验证和完整性。
在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法指定为 SHA1withDSA。如果使用 RSA,对消息摘要算法则会有多种选择,因此,可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA。因为没有默认的算法名称,所以必须为其指定名称。
示例代码
public static byte[] sign(byte[] data, PrivateKey privateK)
throws GeneralSecurityException {
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateK);
signature.update(data);
return signature.sign();
}
public static boolean verify(byte[] data, String sBase64Cert, byte[] sign)
throws GeneralSecurityException {
X509Certificate cerObj = CertUtils.base64StrToCert(sBase64Cert);
PublicKey publicKey = cerObj.getPublicKey();
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sign);
}
RSA为不对称加密算法
主要方法
getInstance
public static Signature getInstance(String algorithm)
throws NoSuchAlgorithmException
返回实现指定签名算法的 Signature 对象。
此方法从首选的提供者开始遍历已注册安全提供者列表。返回封装 SignatureSpi 实现的新 Signature 对象,该实现取自第一个支持指定算法的 Provider。
注意,可以通 Security.getProviders() 方法获取已注册提供者列表。
参数:
algorithm - 所请求算法的标准名称。有关标准算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference 中的附录 A。
返回:
新 Signature 对象。
抛出:
NoSuchAlgorithmException - 如果没有 Provider 支持指定算法的 Signature 实现。
另请参见:
Provider
initSign
public final void initSign(PrivateKey privateKey)
throws InvalidKeyException
初始化这个用于签名的对象。如果使用其他参数再次调用此方法,此调用的结果将无效。
参数:
privateKey - 将生成其签名的标识的私钥。
抛出:
InvalidKeyException - 如果密钥无效。
update
public final void update(byte[] data)
throws SignatureException
使用指定的 byte 数组更新要签名或验证的数据。
参数:
data - 用于更新的 byte 数组。
抛出:
SignatureException - 如果此签名对象未得到正确初始化。
sign
public final byte[] sign()
throws SignatureException
返回所有已更新数据的签名字节。签名的格式取决于基础签名方案。
对此方法的调用将把此签名对象重新设置到以前为进行签名而通过调用 initSign(PrivateKey) 对其初始化时的状态。也就是说,如果需要,通过重新调用 update 和 sign,可重新设置对象,并且可以通过它从同一个签署者中生成其他人的签名。
返回:
签名操作结果的签名字节。
抛出:
SignatureException - 如果此签名对象未得到正确初始化,或者此签名算法不能处理所提供的输入数据。
initVerify
public final void initVerify(PublicKey publicKey)
throws InvalidKeyException
初始化此用于验证的对象。如果使用其他参数再次调用此方法,此调用的结果将无效。
参数:
publicKey - 将验证其签名的标识的公钥。
抛出:
InvalidKeyException - 如果密钥无效。
verify
public final boolean verify(byte[] signature)
throws SignatureException
验证传入的签名。
对此方法的调用将把此签名对象重新设置到以前为进行验证而通过调用 initVerify(PublicKey) 对其初始化时的状态。也就是说,该对象将被重新设置,并且可以用来验证调用 initVerify 时其公钥所指定的标识中的其他签名。
参数:
signature - 要验证的签名字节。
返回:
如果签名得到验证,则返回 true,否则将返回 false。
抛出:
SignatureException - 如果此签名对象未得到正确初始化,传入的签名未得到正确解码,或类型错误,如果此签名算法不能处理所提供的输入数据等。
java.security.cert.X509Certificate
概述
类 X509Certificate
java.lang.Object
java.security.cert.Certificate
java.security.cert.X509Certificate
所有已实现的接口:
Serializable, X509Extension
public abstract class X509Certificateextends Certificateimplements X509Extension
X.509 证书的抽象类。此类提供了一种访问 X.509 证书所有属性的标准方式。
1996 年 6 月,ISO/IEC 和 ANSI X9 完成了基本的 X.509 v3 格式,在 ASN.1 中描述如下:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING }
这些证书被广泛使用以支持 Internet 安全系统中的身份验证和其他功能。常见的应用包括增强保密邮件 (PEM)、传输层安全 (SSL)、用于受信任软件发布的代码签名和安全电子交易 (SET)。
由证书颁发机构 (CA) 来管理和担保这些证书。CA 的工作是创建证书,方法是将数据置于 X.509 标准格式,然后以数字方式签署该数据。CA 充当受信任的第三方,在不能直接通信的主体之间传递信息。CA 证书可由其自身签名,也可由其他 CA 签名,如“根”CA。
在 RFC 2459,即 “Internet X.509 Public Key Infrastructure Certificate and CRL Profile”(位于 http://www.ietf.org/rfc/rfc2459.txt)中可找到更多信息。
java.security.cert.Certificate
概述
类 Certificate
java.lang.Object
java.security.cert.Certificate
所有已实现的接口:
Serializable
直接已知子类:
X509Certificate
public abstract class Certificateextends Objectimplements Serializable
管理各种身份证书的抽象类。身份证书是一个主体与由另一个主体所担保的公钥之间的绑定关系。(一个主体表示一种实体,如个体用户、一个用户组或一家公司)。
此类是具有不同格式但是很常用的证书的抽象。例如,不同的证书类型(如 X.509 和 PGP)共享通用的证书功能(如编码和验证)和某些信息类型(如公钥)。
虽然 X.509、PGP 和 SDSI 证书包含不同的信息集,并且它们以不同的方式存储和获取信息,但都可以通过继承 Certificate 类来实现它们。
主要方法
getPublicKey
public abstract PublicKey getPublicKey()从此证书中获取公钥。
返回:
公钥