Java 向私钥添加密码的数字证书:未能解码文件:不是PKCS#12格式,

Java 向私钥添加密码的数字证书:未能解码文件:不是PKCS#12格式,,java,encryption,cryptography,digital-signature,digital-certificate,Java,Encryption,Cryptography,Digital Signature,Digital Certificate,编写代码生成数字证书 在浏览器中安装时,会出现错误 无法解码该文件。它不是PKCS#12格式,已损坏,或者您输入的密码不正确 但我不知道如何添加该密码以满足PKCS\12格式的要求。怎么做 public KeyPair generateKeyPair() { KeyPair pair = null; try { String password = "1234"; KeyPairGenerator keyGen =

编写代码生成数字证书

在浏览器中安装时,会出现错误

无法解码该文件。它不是PKCS#12格式,已损坏,或者您输入的密码不正确

但我不知道如何添加该密码以满足
PKCS\12格式的要求。怎么做

public KeyPair generateKeyPair() {
        KeyPair pair = null;
         try {
            String password = "1234";
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            SecureRandom random = Utils.createFixedRandom(); 
            keyGen.initialize(1024, random);
            pair = keyGen.generateKeyPair();
            PrivateKey privkey1 = pair.getPrivate();
            PublicKey pubKey1 = pair.getPublic();

            byte[] privateKeyBytes = pair.getPrivate().getEncoded();
            byte[] encryptedPrivateKeyBytes = passwordEncrypt(
                    password.toCharArray(), privateKeyBytes);

                   //Problem might be here  

            Signature dsa = Signature.getInstance("SHA1withRSA");
            dsa.initSign(privkey1);
            Cipher cipher = Cipher
                    .getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey1, random);
            byte[] input = new byte[] { (byte) 0xbe, (byte) 0xef };
            System.out.println("input : " + Utils.toHex(input));
            byte[] cipherText = cipher.doFinal(input);
            System.out.println("cipher: " + Utils.toHex(cipherText));
            cipher.init(Cipher.DECRYPT_MODE, privkey1);
            byte[] plainText = cipher.doFinal(cipherText);
            System.out.println("plain : " + Utils.toHex(plainText));
        } catch (Exception e) {
            System.err.println("Caught exception " + e.toString());
        }

        return pair;

    }
证书已成功生成并卡在此处


谢谢您的提示。

我已经查看了您的代码,我认为问题在于您使用certificate.getEncoded()以原始二进制DER格式输出证书,而浏览器需要PKCS#12格式。我从来没有通过编程实现过,我总是使用keytool或openssl在格式之间进行转换,所以我只能这样


eta:这解释了如何用java创建、签名和导出PKCS12:(注意:这是一篇老文章,需要bouncycastle和一些黑客攻击:(-现代版本的bouncycastle可能只提供此功能)

谢谢你的提示,tom,我会朝那个方向看。刚开始学密码学祝你好运。处理PKI可能是一场噩梦:这说明了如何输出PEM,我认为浏览器可以使用它:(页眉,base64encodedbytes,页脚)这真的很接近。再次感谢。因为我们是程序员,每个问题对我们来说都是一场噩梦:(啊哈,这解释了如何做:(它创建了一个pkcs12并以编程方式签名)您是作为个人(客户端)安装的吗浏览器中的证书,或浏览器中的受信任服务器证书?如果它是受信任的证书,则只需要证书文件,而不需要PKCS12。例如,在Firefox中,当您转到证书管理器和“权限”选项卡并单击“导入”时,它需要证书。如果您转到“您的证书”选项卡,它需要一个P12,因为P12将包含私钥,并用于向其他服务器证明您的身份。@gtrig感谢gtrig的详细注释。我试图实现的是我将向用户(客户)提供一个证书它有一个私钥和公钥。他在他的浏览器中安装了该证书,当我的应用程序启动时,我会得到该证书并用于数据的加密和解密。请给我一些提示。我无法从这一点出发。@SURESH听起来你确实需要私钥。我不清楚的是你的应用程序如何与使用浏览器密钥库。您的应用程序是否在他的服务器上运行(与他的浏览器运行的服务器相同?)或者您的应用程序是否在其浏览器连接的另一台服务器上运行?@gtrig根据您的评论,我想我在这里遗漏了很多详细信息。我可以通过电子邮件Id与您交谈以寻求澄清吗?我的任务是向用户提供一个包含私钥和公钥的自签名证书。他向用户提供了一个密码我。在他的浏览器中安装时,它会要求输入该密码。在他安装后,就是这样。稍后,我们的应用程序会使用我们的web应用程序中的小程序联系该证书。您能在这方面帮助我吗?