Ottenere un x509 firmato quando si utilizzano i tasti ECDSA
-
19-09-2019 - |
Domanda
Sto cercando di firmare alcuni certificati X509. La mia radice chiave privata è un secp384r1 ECDSA. Sto usando castello gonfiabile. Ciò che sembra accadere è che quando si genera la firma del certificato, la classe Signature utilizzato è in grado di capire la mia chiave ECDSA.
Il codice che genera è la seguente:
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"
L'output di questo è:
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)
Con la lettura del codice sorgente BouncyCastle, ho rintracciato questo problema e si riproducono con il seguente frammento di codice:
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();
}
che produce l'uscita:
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)
Il problema è che io sono completamente perso a questo punto. Non so come fare il generatore certificato di darmi un certificato firmato. Qualcuno ha qualche idea di quello che sto facendo male?
Soluzione
ho rintracciato giù ad alcuni vecchi barattoli che non erano stati eliminati dal POM e che causano la versione sbagliata di BouncyCastle classificato da utilizzare.