java KeyStore 使用

来源:互联网 发布:linux vi查看文件内容 编辑:程序博客网 时间:2024/05/17 01:38

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);

       }

}

原创粉丝点击