Java中JKS不同类型的keystore

Java中JKS不同类型的keystore

JKS是Java中的keystore,keystore是java的密钥库、用来进行通信加密用的、比如数字签名。keystore就是用来保存密钥对的,比如公钥和私钥。具体用法,在网上搜java数字签名,文件加密就行了、有很多教程的。

接下来我们将展示如何使用纯Java代码的JKS keystore。

1.创建JKS的keystore

创建一个硕密钥库创建一个空的密钥库的最简单的方法。我们可以先得到密钥库实例,然后加载一个空库。加载后的空库,我们只需要为密钥的密钥。密钥名称和密码store()。

下面是一个简单的演示:

package cn.iigrowing.keystore.store;

import java.io.FileOutputStream;
import java.security.KeyStore;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IigJavaStore {
    final static Logger logger = LoggerFactory.getLogger(IigJavaStore.class);

    public static void main(String[] args) throws Exception {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream("mytestkey.jks"), "password".toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
在调用后执行),你会看到在当前工作目录mytestkey.jks keystore介绍。现在还没有任何keystore是空的。

2.存储私钥

现在让我们来存储一个私钥和相关的证书链的密钥。注意我们不能存储私钥不相关的证书链到一个密钥使用JDK。与其他一些库或本地库,你可以存储私钥不相关的证书链。

请确保前面的代码正确运行了, 这样下那个项目下面会创建一个mytestkey.jks文件, 这样在相同项目里面在创建下面代码, 才能正确运行, 代码如下:

package cn.iigrowing.keystore.store;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.X509Certificate;

//import javax.security.cert.X509Certificate;
import sun.security.x509.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IigJavaStore2 {
    final static Logger logger = LoggerFactory.getLogger(IigJavaStore2.class);

    public static void main(String[] args) throws Exception {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("mytestkey.jks"), "password".toCharArray());

            CertAndKeyGen gen = new CertAndKeyGen("RSA", "SHA1WithRSA");
            gen.generate(1024);

            Key key = gen.getPrivateKey();
            X509Certificate cert = gen.getSelfCertificate(new X500Name("CN=ROOT"), (long) 365 * 24 * 3600);

            X509Certificate[] chain = new X509Certificate[1];
            chain[0] = cert;

            keyStore.setKeyEntry("mykey", key, "password".toCharArray(), chain);

            keyStore.store(new FileOutputStream("mytestkey.jks"), "password".toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
首先,我们将创建一个私钥和一个自签名证书,然后调用库。setkeyentry()与指定的别名,关键的关键,和其相关的证书链的密码。记得我们需要调用库。store()存储在keystore关键。

别名的条目,它很容易被发现后,标签。

3.存储证书

我们可以存储在keystore证书张根硕。将证书存储应X509Certificate。它可以存储在keystore无关联的私钥。这个过程类似于存储私钥。
package cn.iigrowing.keystore.store;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.X509Certificate;

//import javax.security.cert.X509Certificate;
import sun.security.x509.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IigJavaStore3 {
    final static Logger logger = LoggerFactory.getLogger(IigJavaStore3.class);

    public static void main(String[] args) throws Exception {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("mytestkey.jks"), "password".toCharArray());

            CertAndKeyGen gen = new CertAndKeyGen("RSA", "SHA1WithRSA");
            gen.generate(1024);

            X509Certificate cert = gen.getSelfCertificate(new X500Name("CN=SINGLE_CERTIFICATE"),
                    (long) 365 * 24 * 3600);

            keyStore.setCertificateEntry("single_cert", cert);

            keyStore.store(new FileOutputStream("mytestkey.jks"), "password".toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

4.加载私钥

存储键后,我们还可以加载项在密钥。我们在这里所说的加载私钥,其实这不是这里的情况,如前所述,私钥不能从张根硕使用Java提取。在这里,我们实际上提取私钥的证书链。
package cn.iigrowing.keystore.store;

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IigJavaStore5 {
    final static Logger logger = LoggerFactory.getLogger(IigJavaStore5.class);

    public static void main(String[] args) throws Exception {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("mytestkey.jks"), "password".toCharArray());

            Key key = keyStore.getKey("alias", "password".toCharArray());
            // System.out.println("Private key : "+key.toString()); //You will
            // get a NullPointerException if you uncomment this line

            java.security.cert.Certificate[] chain = keyStore.getCertificateChain("mykey");
            for (java.security.cert.Certificate cert : chain) {
                System.out.println(cert.toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

20160308161019
注意注释行,关键是空的预期。我们可以拿到证书链正常但。
代码
[
[
Version: V3
Subject: CN=ROOT
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

Key:  Sun RSA public key, 1024 bits
modulus: 90980299845597512779139009881469177009407272139633139241921529845092210461181243924599150259446249079941561941533303439718936138867375776965995893255358889228584415558006141961051402385279285497775776996780406808976543439543789816486513982581378223575354716191394304768315366544413052547926792470794374067383
public exponent: 65537
Validity: [From: Sat Sep 06 09:57:28 CST 2014,
To: Sun Sep 06 09:57:28 CST 2015]
Issuer: CN=ROOT
SerialNumber: [    206b697b]

]
Algorithm: [SHA1withRSA]
Signature:
0000: 53 6A FD FE E6 3A 5E 6E   A6 43 C4 F4 D1 56 D4 08  Sj...:^n.C...V..
0010: 7E 3B 8B 73 68 71 56 AB   96 FE 24 E7 2D DC 04 BB  .;.shqV...$.-...
0020: 14 B0 C6 71 8D F0 3E EC   FE D8 5B BB 8C 0F 55 63  ...q..>...[...Uc
0030: 2B 38 8E 45 F1 2D F0 BB   8C 6D 13 A8 11 37 E1 FA  +8.E.-...m...7..
0040: 77 AF C7 73 72 2B 40 4F   74 32 F6 3C 24 E6 AB ED  w..sr+@Ot2.<$...
0050: 2C 6F 19 2E DC 58 5F CB   75 62 40 2F 3E BE 59 99  ,o...X_.ub@/>.Y.
0060: C0 1F 7A 70 15 AF C3 66   B3 4F C9 11 C3 45 59 EF  ..zp...f.O...EY.
0070: 36 F4 1C C9 9B FA 5E 43   A0 28 DB 07 0D F2 53 6E  6.....^C.(....Sn

]

5.加载证书

这是类似于加载私钥,我们需要通过我们要提取证书别名。java代码
package cn.iigrowing.keystore.store;

import java.io.FileInputStream;
import java.security.KeyStore;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IigJavaStore6 {
    final static Logger logger = LoggerFactory.getLogger(IigJavaStore6.class);

    public static void main(String[] args) throws Exception {
        try {
            KeyStore keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream("mytestkey.jks"), "password".toCharArray());

            java.security.cert.Certificate cert = keyStore.getCertificate("single_cert");

            System.out.println(cert.toString());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
20160308161225
输出将是:
代码
[
[
Version: V3
Subject: CN=SINGLE_CERTIFICATE
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

Key:  Sun RSA public key, 1024 bits
modulus: 99756834215197288877309915243024788596281418171661241282881476656110879586349799740269767889529808199104172091786860877280382867461569439907754755558759387462421169749111354565793974372777424046360810758009149155148290676527032833774084635148674232352006810533640038723102562578516643345287042787777951043863
public exponent: 65537
Validity: [From: Sat Sep 06 10:14:33 CST 2014,
To: Sun Sep 06 10:14:33 CST 2015]
Issuer: CN=SINGLE_CERTIFICATE
SerialNumber: [    6943e549]

]
Algorithm: [SHA1withRSA]
Signature:
0000: 35 58 70 96 F4 35 82 2A   95 9F BB 31 02 6E 7C 29  5Xp..5.*...1.n.)
0010: 4A FE AF EB 2D B5 3A A7   C7 9D 4C 9A 34 2C 5C 46  J...-.:...L.4,\F
0020: C2 82 A8 AC 1A C0 98 A5   67 21 74 7B 1E E2 E5 AC  ........g!t.....
0030: DE B2 1D 87 BE 16 45 9B   D0 2A D3 2B F6 E1 4B 35  ......E..*.+..K5
0040: 27 8B A7 0A EF F2 07 41   90 A6 69 07 BE 87 C5 B1  '......A..i.....
0050: 54 DE DB A2 5A 41 47 3B   3F A7 74 6F 5C C8 8D B4  T...ZAG;?.to\...
0060: C8 65 2B 0F 8E 94 A8 80   C7 8B B5 78 FA C2 9C ED  .e+........x....
0070: 8E EC 28 E4 8E 62 A1 59   6A BC 37 7B 0D FC C7 AF  ..(..b.Yj.7.....

]

6.导入密钥和证书
这个过程其实很简单,我们首先需要加载密钥库,将证书导入。然后我们还需要加载另一个密钥库,我们需要进口证书。接下来,我们需要从源库获得证书并把它转化为目标库。
既然我们不能提取张根硕私钥,所以我们只能导入证书硕。然而,我们可以从其他类型的密钥提取私钥(12),然后将它们存储在keystore硕。
我们将在以后的文章中其他类型keystore。
来源: http://www.webkfa.com/one7/w495.html

发表评论