Получение подписанного x509 при использовании ключей ECDSA - PullRequest
4 голосов
/ 11 марта 2010

Я пытаюсь подписать некоторые сертификаты X509. Мой корневой закрытый ключ - ECDSA secp384r1. Я использую надувной замок. Кажется, что при генерации подписи сертификата используемый класс Signature не может понять мой ключ 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 Ответ

2 голосов
/ 11 марта 2010

Я проследил это до некоторых старых jar-файлов, которые не были удалены из POM и из-за которых используется неверная версия Bouncycastle

...