代码之家  ›  专栏  ›  技术社区  ›  laura

使用ECDSA密钥时获取已签名的X509

  •  4
  • laura  · 技术社区  · 15 年前

    我正在尝试签署一些X509证书。我的根私钥是ecdsa secp384r1。我在使用弹跳城堡。似乎在生成证书签名时,使用的签名类无法理解我的ECDSA密钥。

    生成的代码如下:

        X509V3CertificateGenerator v3CertGen = new X509V3CertificateGenerator();
        v3CertGen.setSerialNumber(BigInteger.valueOf(serialNumber));
        v3CertGen.setIssuerDN(issuerPrincipal);
        v3CertGen.setNotBefore(notBefore);
        v3CertGen.setNotAfter(notAfter);
        v3CertGen.setSubjectDN(subjectDN);
        v3CertGen.setPublicKey(publicKey);
        v3CertGen.setSignatureAlgorithm(CERT_SIGNATURE_ALGORITHM); // this is ECDSAWITHSHA1
        X509Certificate cert = v3CertGen.generate(privateKey, BOUNCY_CASTLE_PROVIDER); // "BC"
    

    其输出为:

    java.security.InvalidKeyException: can't identify DSA private key.
        at org.bouncycastle.jce.provider.DSAUtil.generatePrivateKeyParameter(Unknown Source)
        at org.bouncycastle.jce.provider.JDKDSASigner.engineInitSign(Unknown Source)
        at java.security.Signature.initSign(Signature.java:480)
        at org.bouncycastle.x509.X509Util.calculateSignature(Unknown Source)
        at org.bouncycastle.x509.X509V3CertificateGenerator.generate(Unknown Source)
        at org.bouncycastle.x509.X509V3CertificateGenerator.generate(Unknown Source)
        at com.snip.utils.CertificateUtility.generateAndSignCertificate(CertificateUtility.java:147)
    

    通过阅读bouncycastle源代码,我跟踪了这个问题,并用以下代码片段进行了重现:

    Signature sig = Signature.getInstance(CERT_SIGNATURE_ALGORITHM, BOUNCY_CASTLE_PROVIDER);
    System.out.println(sig.getAlgorithm());
    System.out.println(sig.toString());
    System.out.println(sig.getClass().getName());
    try
    {
        sig.initSign(privateKey);
        System.out.println(sig.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    产生输出:

    SHA1withECDSA
    Signature object: SHA1withECDSA<not initialized>
    org.bouncycastle.jce.provider.JDKDSASigner$ecDSA
    java.security.InvalidKeyException: can't identify DSA private key.
            at org.bouncycastle.jce.provider.DSAUtil.generatePrivateKeyParameter(Unknown Source)
            at org.bouncycastle.jce.provider.JDKDSASigner.engineInitSign(Unknown Source)
            at java.security.Signature.initSign(Signature.java:480)
            at com.snip.utils.CertificateUtility.<init>(CertificateUtility.java:99)
    

    问题是我在这一点上完全迷路了。我不知道如何让证书生成器给我一个签名的证书。有人知道我做错了什么吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   laura    15 年前

    我把它追溯到一些旧的罐子,这些罐子没有从POM中删除,导致使用了错误版本的bouncycastle类。