【问题标题】:Digital certificate adding password to private key :Failed to decode the file :Not in PKCS #12 format,将密码添加到私钥的数字证书:无法解码文件:不是 PKCS #12 格式,
【发布时间】:2013-10-16 23:51:04
【问题描述】:

编写代码生成数字证书

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

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

但我不知道如何添加该密码以满足PKCS #12 format。怎么搭配?

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;

    }

证书生成成功,卡在这里。

You can see full code here.

感谢任何提示。

【问题讨论】:

  • 您是在浏览器中将其安装为个人(客户端)证书,还是作为浏览器中的受信任服务器证书?如果它是受信任的证书,您应该只需要证书文件,而不是 PKCS12。例如,在 Firefox 中,当您转到证书管理器和“权限”选项卡并单击导入时,它需要一个证书。如果您转到“您的证书”选项卡,它需要一个 P12,因为 P12 将包含私钥,用于向另一台服务器证明您的身份。
  • @gtrig 感谢 gtrig 的详细评论。我想要实现的是我将向用户(客户)提供一个具有私钥和公钥的证书。他在他的浏览器中安装了该证书,当我的应用程序启动时,我会得到它并用于加密和解密数据。请给我一些提示..我无法从这一点上移动。
  • @SURESH 听起来您确实需要私钥。我不清楚的是您的应用程序如何与浏览器密钥库进行交互。您的应用程序是否在他的服务器上运行(他的浏览器运行在同一台服务器上?)或者您的应用程序是否在他的浏览器连接到的另一台服务器上运行?
  • @gtrig 根据您的评论,我想我在这里遗漏了很多细节。我可以通过电子邮件 ID 与您交谈以寻求澄清吗?我的任务是向用户提供包含私钥和公钥的自签名证书。他给我一个密码。在他的浏览器中安装时,它会要求输入该密码。他安装后就是这样。稍后,我们的应用程序使用 Web 应用程序中的小程序联系该证书。你能帮我吗?

标签: java encryption cryptography digital-signature digital-certificate


【解决方案1】:

我查看了您的代码,我认为问题在于当浏览器需要 PKCS #12 格式时,您使用 certificate.getEncoded() 以原始二进制 DER 格式输出证书。我从未以编程方式完成此操作,我一直使用 keytool 或 openssl 在格式之间进行转换,因此我无能为力。

eta:这解释了如何在 java 中创建、签名和导出 PKCS12:http://www.mayrhofer.eu.org/create-x509-certs-in-java(注意:这是一篇旧帖子,需要 bouncycastle 和一些黑客攻击 :( - 现代版本的 bouncycastle 可能只是提供此功能)

【讨论】:

  • 感谢汤姆的提示,我会朝那个方向看。刚开始使用密码学
  • 祝你好运。处理 PKI 可能是一场噩梦:D
  • 这解释了如何输出 PEM,我认为它可以被浏览器使用:stackoverflow.com/questions/3313020/… (header, base64encodedbytes, footer)
  • 真的很接近。再次感谢。由于我们是程序员,每一个问题对我们来说都是一场噩梦:(
  • 啊哈,这解释了如何做到这一点:mayrhofer.eu.org/create-x509-certs-in-java(它创建一个 pkcs12 并以编程方式对其进行签名)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2016-11-17
  • 2019-05-28
  • 2012-09-19
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多