證書文件存在多種格式: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
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(); } }