Java 解析PFX证书获取私钥 附加Byte以及字符类型转换

该博客介绍了一个Java工具类,用于解析PFX文件并从中获取私钥。通过加载PKCS12类型的KeyStore,使用指定的密码,遍历别名找到证书,然后获取对应的私钥。此外,还提供了将字节转换为十六进制字符串和反向转换的方法。示例代码展示了如何调用这些方法来处理指定路径的PFX文件。
摘要由CSDN通过智能技术生成

PFX证书,同时包含了公钥信息和私钥信息。
这里编写解析处理PFX的工具类,用来获取私钥。

引用相关:

import java.io.*;  
import java.util.*;  
import java.security.*;  
import java.security.cert.Certificate;  
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import sun.misc.BASE64Encoder; 

方法类以及方法:

public class ReadPFX {  
    public ReadPFX (){  
    }  
  

   
  //解析PFX文件获取私钥
     private static  PrivateKey GetPvkformPfx(String strPfx, String strPassword){  
        try {  
            KeyStore ks = KeyStore.getInstance("PKCS12");  
            FileInputStream fis = new FileInputStream(strPfx);  
            // If the keystore password is empty(""), then we have to set  
            // to null, otherwise it won't work!!!  
            char[] nPassword = null;  
            if ((strPassword == null) || strPassword.trim().equals("")){  
                nPassword = null;  
            }  
            else  
            {  
                nPassword = strPassword.toCharArray();  
            }  
            ks.load(fis, nPassword);  
            fis.close();  
            System.out.println("keystore type=" + ks.getType());  
            // Now we loop all the aliases, we need the alias to get keys.  
            // It seems that this value is the "Friendly name" field in the  
            // detals tab <-- Certificate window <-- view <-- Certificate  
            // Button <-- Content tab <-- Internet Options <-- Tools menu   
            // In MS IE 6.  
            Enumeration enumas = ks.aliases();  
            String keyAlias = null;  
            if (enumas.hasMoreElements())// we are readin just one certificate.  
            {  
                keyAlias = (String)enumas.nextElement();   
                System.out.println("alias=[" + keyAlias + "]");  
            }  
            // Now once we know the alias, we could get the keys.  
            System.out.println("is key entry=" + ks.isKeyEntry(keyAlias));  
            PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);  
            Certificate cert = ks.getCertificate(keyAlias);  
            PublicKey pubkey = cert.getPublicKey();  
            System.out.println("cert class = " + cert.getClass().getName());  
            System.out.println("cert = " + cert);  
            System.out.println("public key = " + pubkey);  
            System.out.println("private key = " + prikey); 
            BASE64Encoder encoder=new BASE64Encoder();
            String encoded=encoder.encode(prikey.getEncoded());
            System.out.println(encoded);
            return prikey;  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        return null;  
    }  

     
     //转换成十六进制字符串  
     public static String Byte2String(byte[] b) {  
         String hs="";  
         String stmp="";  

         for (int n=0;n<b.length;n++) {  
             stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));  
             if (stmp.length()==1) hs=hs+"0"+stmp;  
             else hs=hs+stmp;  
             //if (n<b.length-1)  hs=hs+":";  
         }  
         return hs.toUpperCase();  
     }  

     
     //转换成字节
     public static byte[] StringToByte(int number) {   
         int temp = number;   
         byte[] b=new byte[4];   
         for (int i=b.length-1;i>-1;i--){   
             b[i] = new Integer(temp&0xff).byteValue();//将最高位保存在最低位   
             temp = temp >> 8; //向右移8位   
         }   
         return b;   
     } 
 

}  

方法调用示例:

public static void main(String[] args) {
         GetPvkformPfx("D://acp_prod_sign.pfx","000000");
    }
Java中,读取.cer (证书) 或.pfx (个人信息交换文件) 文件并获取其中的公钥和私钥,通常需要使用`KeyStore`和`Certificate`类,以及`java.security`包下的工具。以下是基本步骤: 1. **加载keystore**: 使用`KeyStore.getInstance()`方法加载keystore,提供正确的类型(如JKS、PKCS12等)和文件路径。 ```java KeyStore keyStore = KeyStore.getInstance("PKCS12"); InputStream in = new FileInputStream("path_to_your_pfx_file.pfx"); keyStore.load(in, "password".toCharArray()); ``` 2. **获取证书链**: 使用`keyStore.getCertificateChain(certAlias)`获取包含证书的链,`certAlias`是证书别名。 3. **获取信任管理器**: 创建`TrustManagerFactory`,然后从keystore中获取`X509TrustManager`。 ```java TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); ``` 4. **获取公钥和私钥**: 对于.cer文件,证书中通常包含公钥,而.pfx还包含了私钥。如果仅需公钥,可以遍历证书链,每个证书都有公开的`getPublicKey()`方法。如果需要私钥,你需要创建`KeyPairGenerator`,并通过`Certificate`对象的`getPrivateKey()`方法得到。 ```java for (Certificate cert : chain) { PublicKey publicKey = cert.getPublicKey(); // 对于PFX,还需处理PrivateKey } ``` 请注意,`.pfx`文件中可能有多个key entry,每个entry对应一对公钥和私钥。操作需要确定所需的密钥对。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值