Java解析p12文件

做公司项目遇到了关于GoogleBigQuery的问题,而要使用这个服务需要一个证书,要求支持json和p12文件两种格式。这里主要记录一下如何从p12文件中读取出公钥和私钥信息。


import sun.misc.BASE64Encoder;

import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Key;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;

import java.io.*;
import java.util.Base64;
import java.util.Enumeration;

public class ReadP12Cert {
    public static void main(String[] args) {
        //文件路径
        final String KEYSTORE_FILE = "yourfilename";
        //生成p12文件时的密码,Google的统一密码是"notasecret"
        final String KEYSTORE_PASSWORD = "p12secret";
        final String KEYSTORE_ALIAS = "alias";

        try {
            KeyStore ks = KeyStore.getInstance("PKCS12");
            InputStream fis = new FileInputStream(KEYSTORE_FILE);
            char[] nPassword = null;

            if ((KEYSTORE_PASSWORD == null) || KEYSTORE_PASSWORD.trim().equals("")) {
                nPassword =null;
            } else {
                nPassword = KEYSTORE_PASSWORD.toCharArray();
            }

            //循环获取别名
            Enumeration enumm =ks.aliases();
            String keyAlias = null;
            if ( enumm.hasMoreElements()) // we are readin just one certificate.
            {
                keyAlias = (String) enumm.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);
            //第二种获取私钥的方式,这个是写在KeyStore文档里的,似乎是比较推荐的那种
            KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(nPassword);
            KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)ks.getEntry("privatekey", protParam);
            PrivateKey myPrivateKey = pkEntry.getPrivateKey();
            //base64解码,获取真正信息
            byte[] a=myPrivateKey.getEncoded();
            System.out.println(new BASE64Encoder().encode(a));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

参考:
https://blog.csdn.net/cuiran/article/details/7816696/

不过我自己还有个疑问,我在前端post上传p12文件,后端通过requst.getInuptStream()获取文件内容,转成InputStream,想要生成KeyStore来获取私钥信息,报错”java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big.”,网上搜到的信息大多是maven修改了证书,但和我的情况并不相似。我不知道是否是我在读取过程中编码问题,还是其他什么问题导致我得到的内容和文件内容不一致,困扰良久。而我又不能直接读取文件,必须上传。如果有知道原因的朋友,希望能告诉我一声,谢谢。

发布了43 篇原创文章 · 获赞 31 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/devil_bye/article/details/82691629
今日推荐