java

java 解析 p7b 证书调用链

2018-12-02  本文已影响0人  恏人_7d7c

什么是p7b格式证书?

p7b一般是证书链,里面包括1到多个证书,至少包含一个根证书。

我们项目中利用第三方证书颁发机构进行证书的获取以及管理,最近遇到需要将base64后的p7b格式证书调用链进行解析后将证书信息入库,留作后期数据核对结算,在网上找了解析p7b的例子无果后,特地记录在此供需要者参考。

java 解析p7b

public static X509Certificatepkcs7CertificateOfAnalysis(String buffer)throws Exception {
// 文件格式

/*File f = new File("C:\\Users\\W\\Desktop\\public_key.p7b");

byte[] buffer = new byte[(int) f.length()];

DataInputStream in = new DataInputStream(new FileInputStream(f));

in.readFully(buffer);

in.close();*/

        PKCS7 pkcs7 =new PKCS7(Base64.decode(buffer));

        X509Certificate[] certificates = pkcs7.getCertificates();

        if(certificates ==null){

throw new ApiException(WrapperEnumError.SIGN_AUTHENTICATION.getCode(),"The certificate is empty");

        }

List x509Certificates =new ArrayList(Arrays.asList(certificates));

        int length = x509Certificates.size();

        String  rootSub =null;

        //证书调用链必有一个根证书

        for (int i =0; i < length; i++) {

X509Certificate certificate = x509Certificates.get(i);

//判断根证书

if(certificate.getSubjectDN().getName().equals(certificate.getIssuerDN().getName())){

rootSub = certificate.getSubjectDN().getName();

                    x509Certificates.remove(i);

                    length = length -1;

                }

}

//判断二级ca证书

for (int i =0; i < length; i++) {

X509Certificate certificate = x509Certificates.get(i);

                if(certificate.getIssuerDN().getName().equals(rootSub)){

x509Certificates.remove(i);

                    length = length -1;

                }

}

//由于我们对接的第三方  第三方根证 -->  第三方为公司颁发的ca根证  --> 用户证书

X509Certificate certificate = x509Certificates.get(x509Certificates.size() -1);

//        certificate.verify(certificate.getPublicKey());

        return certificate;

    }


上一篇下一篇

猜你喜欢

热点阅读