美文网首页
使用Java从PKCS12证书中解析私钥、公钥和证书编号

使用Java从PKCS12证书中解析私钥、公钥和证书编号

作者: 十毛tenmao | 来源:发表于2021-05-29 10:56 被阅读0次

微信支付对接用到的商户API证书是PKCS12格式,常见后缀名是.p12。调用微信支付接口时,都需要用到私钥和证书序列号,为了方便用户,所以一般要求用户直接上传证书(.p12文件),再由后台解析私钥和证书序列号。 而且因为证书本身是一个文件,不方便存储到数据库,所以也转成BASE64格式后再存储。

直接上代码

public class P12Application {
    public static void main(String[] args) throws Exception {
        //从文件中解析
        try (FileInputStream is = new FileInputStream("apiclient.p12")) {
            System.out.println(P12Info.parse(is, "证书密码"));
        }

        //从Base64加密串中解析
        String p12Base64 = "xxxyyyzzz";
        byte[] base64byte = Base64.getDecoder().decode(p12Base64);
        try (ByteArrayInputStream is = new ByteArrayInputStream(base64byte)) {
            System.out.println(P12Info.parse(is, "证书密码"));
        }
    }

    @Data
    @Builder
    private static class P12Info {
        /**
         * 证书序列号.
         */
        private final String serialNo;

        /**
         * 证书秘钥.
         */
        private final PrivateKey privateKey;

        /**
         * 公钥.
         */
        private final PublicKey publicKey;

        public static P12Info parse(InputStream is, String passwd) throws Exception {
            KeyStore ks = KeyStore.getInstance("PKCS12");
            ks.load(is, passwd.toCharArray());
            String keyAlias = null; 
            //解析证书,必须有别名
            Enumeration<String> aliases = ks.aliases();
            if (aliases.hasMoreElements()) {
                keyAlias = aliases.nextElement();
            }
            //解析私钥
            PrivateKey privateKey = (PrivateKey) ks.getKey(keyAlias, passwd.toCharArray());
            Certificate cert = ks.getCertificate(keyAlias);
            BigInteger serialNumber = ((X509CertImpl) cert).getSerialNumber();
            //证书一般都使用16进制表示
            String certSn = serialNumber.toString(16);
           
            //设置证书序列号和私钥
            return P12Info.builder()
                    .serialNo(certSn)
                    .privateKey(privateKey)
                    .publicKey(cert.getPublicKey())
                    .build();
        }
    }
}

常见问题

  • 解析的私钥和公钥都是空:需要检查证书别名是否正确

相关文章

  • 使用Java从PKCS12证书中解析私钥、公钥和证书编号

    微信支付对接用到的商户API证书是PKCS12格式,常见后缀名是.p12。调用微信支付接口时,都需要用到私钥和证书...

  • Java RSA加密/解密

    Java RSA加密&解密如下: 拿到RSA 公钥和私钥后我们可以保存到文件中,代码如下: 解析已有的公钥和私钥,...

  • 在Linux Nginx配置HTTPS

    一、公钥和私钥的获取 可以购买,可以自己生成,本文假设你已经有了公钥和私钥。 二、把SSL证书中的公钥和私钥放到服...

  • RSA算法学习

    从使用场景上说,RSA非对称加密就是提供了公钥和私钥一对密钥,其中公钥公开给其他人,私钥自己保密。使用公钥加密的数...

  • 非对称加密算法

    使用非对称加密加密算法生成一对公钥和私钥, 可以使用公钥加密明文然后私钥解密,也可以使用私钥加密然后公钥进行解密....

  • ipfs-ipns公私钥签名算法

    生成公钥私钥对 公钥生成ID 私钥签名。解析函数分析 :resolver.Resolvenamesys->res...

  • php实现非对称加密

    使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。 1.安装opens...

  • openssl终端命令RSA和DES加解密

    RSA 1、生成公钥和私钥 2、加密解密文件 公钥加密私钥解密 私钥加密公钥解密 3、在程序中使用依次生成 csr...

  • Java实现DH密钥交换算法

    前言 非对称加密算法 加密密钥分为公钥和私钥。可以使用公钥加密私钥解密,也可以使用私钥加密公钥解密。非对称加密算法...

  • 苹果应用签名原理

    公钥和私钥 加密:公钥加密,私钥解密 签名:私钥加密,公钥解密 公私钥是一对,谁都可以加密和解密,具体看使用场景加...

网友评论

      本文标题:使用Java从PKCS12证书中解析私钥、公钥和证书编号

      本文链接:https://www.haomeiwen.com/subject/pezesltx.html