certificate - 使用 ECDSA key 时获取已签名的 x509

标签 certificate bouncycastle signing x509 elliptic-curve

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

生成的代码如下:

    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)

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

最佳答案

我已经将其追溯到一些尚未从 POM 中删除的旧 jar,并导致使用了错误版本的 BouncycaSTLe。

关于certificate - 使用 ECDSA key 时获取已签名的 x509,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2424121/

相关文章:

android - key 工具错误 : java. lang.ClassNotFoundException : org. bouncycaSTLe.jce.provider.BouncyCaSTLeProvider

PKCS#1 PSS (RSASSA-PKCS) 的 Android 签名验证不适用于算法 SHA256withRSA

c# - WCF net.tcp 与基于证书的消息安全性绑定(bind)但安全模式已关闭

python - 使用 kubernetes python cli 列出命名空间中的证书

java - 如何在 java 中使用 bouncycaSTLe 将 PrivateKeyUsage 扩展添加到证书?

pdf-generation - iText/BouncyCaSTLe 抛出 "java.lang.VerifyError: class overrides final method equals"

java - Android 中央 keystore

ssl - 基于操作系统的证书(ca-bundle.crt)是否可以使用 smtp_tls_CAfile 正常工作

ios - 如何正确签署 Cordova 应用程序?

c - Mac 和 Linux 的 Authenticode 或其他代码签名