从crt文件创建p12和keyStore

时间:2017-08-03 15:06:04

标签: java keystore

我想用java apis创建一个密钥库" PCKS12"从现有的crt文件。 可能吗?如果是的话怎么做?

修改

1 / openssl req -newkey rsa:2048 -nodes -keyout keyFile.key -x509 -days 3650 -out certFile.crt
2 /  openssl pkcs12 -export -in certFile.crt -inkey keyFile.key -out tmp.p12 -name alias
第3 / keytool -importkeystore -srckeystore tmp.p12 -srcstoretype PKCS12 -srcstorepass password -destkeystore keyStoreFile.jks -deststoretype JKS -deststorepass password -destkeypass password -alias别名

如何以编程方式制作第2步和第3步?

1 个答案:

答案 0 :(得分:4)

您可以创建一个包含Java keytool的根CA的PKCS#12密钥库:

keytool -importcert -trustcacerts -keystore keystore.p12 -storetype pkcs12 \
  -alias root -file root.crt

系统将提示您输入用于保护密钥库完整性的密码,以便在未经检测的情况下,任何人都无法修改您的信任锚。您可以使用其他选项指定密码,但这可能会在系统上留下密码记录。

此处,-trustcacerts表示您信任要作为证书颁发机构导入的证书。如果将其保留,将显示证书,系统将提示您查看并接受该证书。

别名“root”实际上是商店中证书的昵称,它可以是任何可以帮助您以后识别此证书的内容。

当然,文件“root.crt”是您要导入的CA证书。

编程方式:

static void createTrustStore(Path certificate, Path keystore, char[] password)
        throws IOException, GeneralSecurityException {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate root;
    try (InputStream is = Files.newInputStream(certificate)) {
        root = cf.generateCertificate(is);
    }
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
    pkcs12.load(null, null);
    pkcs12.setCertificateEntry("root", root);
    try (OutputStream os = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) {
        pkcs12.store(os, password);
    }
}

private static final byte[] HEADER = "-----".getBytes(StandardCharsets.US_ASCII);

static void createIdentityStore(Path certificate, Path key, Path keystore, char[] password)
        throws IOException, GeneralSecurityException {
    byte[] pkcs8 = decode(Files.readAllBytes(key));
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PrivateKey pvt = kf.generatePrivate(new PKCS8EncodedKeySpec(pkcs8));
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate pub;
    try (InputStream is = Files.newInputStream(certificate)) {
        pub = cf.generateCertificate(is);
    }
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12");
    pkcs12.load(null, null);
    pkcs12.setKeyEntry("identity", pvt, password, new Certificate[] { pub });
    try (OutputStream s = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) {
        pkcs12.store(s, password);
    }
}

private static byte[] decode(byte[] raw) {
    if (!Arrays.equals(Arrays.copyOfRange(raw, 0, HEADER.length), HEADER)) return raw;
    CharBuffer pem = StandardCharsets.US_ASCII.decode(ByteBuffer.wrap(raw));
    String[] lines = Pattern.compile("\\R").split(pem);
    String[] body = Arrays.copyOfRange(lines, 1, lines.length - 1);
    return Base64.getDecoder().decode(String.join("", body));
}