证书文件格式

证书文件存在多种格式:

1. .p12 .pfx 二进制格式,同时包含证书和私钥,一般有密码保护。
2. .pem 文本格式,保存证书或者私钥
3. .crt 二进制格式或者文本格式,只保存证书 
4. .jks 二进制格式,同时包含证书和私钥,一般有密码保护;
jks是java的专属格式,它可以存储多张证书。
5. .der .cer 二进制格式,只保存证书,不保存密钥

1, p12格式文件转换为pem

openssl pkcs12 -clcerts -out cert_name.pem -in cert_name.p12

2,jks格式转换为crt
我们可以使用 keytool -list -v -keystore cert_name.jks查看jks文件中所有的证书

1). 导出jks文件中指定的证书文件
keytool -export -alias cert_name -file cert_name.crt -keystore keystore.jks

2).
① jks文件转换为PKCS12文件 keytool -importkeystore -srckeystore cert_name.jks
-destkeystore cert_name.p12 -srcstoretype jks -deststoretype pkcs12

② 查看p12证书文件中所有证书信息 
keytool -list -v -keystore cert_name.p12 -storepass store_pass -storetype store_type

③ 从PKCS12文件中导出指定的证书文件 
keytool -keystore cert_name.p12 -storetype pkcs12 -exportcert -alias alias
-file cert_name.crt

3,将证书导入JKS文件

keytool -import -v -trustcacerts -storepass password -alias alias -file cert_name.crt -keystore truststore.jks

Java代码从JKS文件中导出所有证书

private static void exportCertificateFromJKSFile() {
    try {
        // 加载keystore库
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream(new File(PATH + File.separator + "cert.jks")),
                "password".toCharArray());
        // 获取所有证书名
        Enumeration<String> aliases = keyStore.aliases();
        while(aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            Certificate certificate = keyStore.getCertificate(alias);
            // 获取证书内容并进行Base64编码
            String content = new String(Base64.getEncoder()
            .encode(certificate.getEncoded()));
            // 持久化证书
            store(content, alias);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void store(String content, String alias) {
    try {
        File exportedFile = new File(PATH + File.separator + alias + ".pem");
        FileWriter fileWriter = new FileWriter(exportedFile);
        // 证书内容必须以-----BEGIN CERTIFICATE-----\n开头
        fileWriter.write("-----BEGIN CERTIFICATE-----\n");
        fileWriter.write(content);
        fileWriter.write("\n");
        // 证书内容必须以-----BEGIN CERTIFICATE-----结尾
        fileWriter.write("-----END CERTIFICATE-----");
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

水一水
39 声望5 粉丝

总结经验,提升自己