【安全】證書格式轉換

證書文件格式

證書文件存在多種格式:java

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文件中全部的證書code

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文件ssl

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();
    }
}
相關文章
相關標籤/搜索