2017-05-09 2 views
2

Je suis totalement nouveau dans crypto/certs et essaye de générer un certificat en utilisant les bibliothèques Bouncy Castle. En regardant une partie de leur code exemple, voici ce que j'ai jusqu'à présent:Bouncy Castle, NoSuchMethodError (org.bouncycastle.asn1.ASN1Integer)

package crypto; 

import org.bouncycastle.asn1.x500.X500Name; 
import org.bouncycastle.asn1.x509.BasicConstraints; 
import org.bouncycastle.asn1.x509.Extension; 
import org.bouncycastle.asn1.x509.KeyUsage; 
import org.bouncycastle.cert.X509v1CertificateBuilder; 
import org.bouncycastle.cert.X509v3CertificateBuilder; 
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; 
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils; 
import org.bouncycastle.cert.jcajce.JcaX509v1CertificateBuilder; 
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.bouncycastle.operator.ContentSigner; 
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; 

import javax.security.auth.x500.X500Principal; 
import java.io.IOException; 
import java.io.InputStream; 
import java.math.BigInteger; 
import java.security.*; 
import java.security.cert.X509Certificate; 
import java.util.Date; 
import java.util.Properties; 


public class App { 

    private static final int VALIDITY_PERIOD = 7 * 24 * 60 * 60 * 1000; // one week 

    public static void main (String[] args) throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     KeyPair keyPair = generateRSAKeyPair(); 
     X509Certificate rootCert = buildRootCert(keyPair); 
     buildEndEntityCert(keyPair.getPublic(), keyPair.getPrivate(), rootCert); 
    } 

    /** 
    * Create a random 2048 bit RSA key pair 
    */ 
    public static KeyPair generateRSAKeyPair() throws Exception { 
     KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC"); 
     kpGen.initialize(2048, new SecureRandom()); 

     return kpGen.generateKeyPair(); 
    } 

    /** 
    * Build a sample V1 certificate to use as a CA root certificate 
    */ 
    public static X509Certificate buildRootCert(KeyPair keyPair) 
      throws Exception 
    { 
     X509v1CertificateBuilder certBldr = new JcaX509v1CertificateBuilder(
       new X500Name("CN=Test Root Certificate"), 
       BigInteger.valueOf(1), 
       new Date(System.currentTimeMillis()), 
       new Date(System.currentTimeMillis() + VALIDITY_PERIOD), 
       new X500Name("CN=Test Root Certificate"), 
       keyPair.getPublic()); 

     ContentSigner signer = new JcaContentSignerBuilder("SHA1WithRSA").setProvider("BC").build(keyPair.getPrivate()); 

     return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBldr.build(signer)); 
    } 

    /** 
    * Build a sample V3 certificate to use as an end entity certificate 
    */ 
    public static X509Certificate buildEndEntityCert(PublicKey entityKey, PrivateKey caKey, X509Certificate caCert) 
      throws Exception 
    { 

     X509v3CertificateBuilder certBldr = new JcaX509v3CertificateBuilder(
       caCert.getSubjectX500Principal(), 
       BigInteger.valueOf(1), 
       new Date(System.currentTimeMillis()), 
       new Date(System.currentTimeMillis() + VALIDITY_PERIOD), 
       new X500Principal("CN=Test End Entity Certificate"), 
       entityKey); 

     JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils(); 

     certBldr.addExtension(Extension.authorityKeyIdentifier, false, extUtils.createAuthorityKeyIdentifier(caCert)) 
       .addExtension(Extension.subjectKeyIdentifier, false, extUtils.createSubjectKeyIdentifier(entityKey)) 
       .addExtension(Extension.basicConstraints, true, new BasicConstraints(false)) 
       .addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment)); 

     ContentSigner signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(caKey); 

     return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBldr.build(signer)); 
    } 
} 

Mon pom a les différentes libs Bouncy Castle et dernière itext:

<dependencies> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-jdk15on</artifactId> 
      <version>1.56</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcpkix-jdk15on</artifactId> 
      <version>1.47</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcmail-jdk15</artifactId> 
      <version>1.46</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-ext-jdk15on</artifactId> 
      <version>1.55</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcpg-jdk15on</artifactId> 
      <version>1.56</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-debug-jdk15on</artifactId> 
      <version>1.55</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-configuration</groupId> 
      <artifactId>commons-configuration</artifactId> 
      <version>1.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.itextpdf</groupId> 
      <artifactId>itextpdf</artifactId> 
      <version>5.5.11</version> 
     </dependency> 

Mais j'obtiens cette erreur:

Exception in thread "main" java.lang.NoSuchMethodError: org.bouncycastle.asn1.ASN1Integer.<init>(I)V 
    at org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder.createPSSParams(Unknown Source) 
    at org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder.<clinit>(Unknown Source) 
    at org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.<init>(Unknown Source) 
    at crypto.App.buildRootCert(App.java:62) 
    at crypto.App.main(App.java:34) 

Process finished with exit code 1 

Est-ce que quelqu'un sait pourquoi?

Répondre

3

Cela est dû au fait que différentes versions sont utilisées (1.56 et 1.46). Après la version 1.47, many parts of the API have changed.

je pouvais courir votre code changer mon pom.xml pour utiliser la version seulement 1,56:

<dependency> 
    <groupId>org.bouncycastle</groupId> 
    <artifactId>bcprov-jdk15on</artifactId> 
    <version>1.56</version> 
</dependency> 
<dependency> 
    <groupId>org.bouncycastle</groupId> 
    <artifactId>bcmail-jdk15on</artifactId> 
    <version>1.56</version> 
</dependency> 

C'est l'ensemble minimal de libs pour exécuter le code dans votre question. Bien sûr, si votre application doit utiliser d'autres bibliothèques (bcpg, bcprov-ext et ainsi de suite), vous pouvez les inclure en conséquence (mais je vous suggère de choisir les versions> = 1.55, pour éviter ces problèmes de versions mixtes)

note:bcmail dépend de bcpkix et bcprov, donc en fait que bcmail est nécessaire dans pom.xml

+0

Ya qui n'a pas été intentionnel. Je ne connais pas vraiment grand-chose de cet espace de chiffrement et je ne sais même pas s'il y avait d'autres bibliothèques pour que cet exemple de code fonctionne. Recommandez-vous des didacticiels de chiffrement pour commencer à utiliser Java pour créer des certificats, des clés comme vous le feriez avec openssl. (Je pensais que c'était utile à comprendre, mais seulement si c'était dans le java code instd de keytool: https://sites.google.com/site/ddmwsst/create-your-own-certificate-and-ca) – Crystal

+0

Pour les certificats création/manipulation, je crois ** bcprov ** et ** bcmail ** suffisent (comme dans la réponse), je n'ai jamais eu besoin d'utiliser ** bcpg **, ** bcprov-ext ** et autres . Didacticiels: Je suggérerais [java security guide] (http://docs.oracle.com/javase/8/docs/technotes/guides/security), en particulier les chapitres ** Public Key Infrastructure **. Bouncycastle a aussi une [doc page] (http://www.bouncycastle.org/documentation.html) mais je pense que ça pourrait être mieux. –

+0

Pour quelque chose de plus conceptuel et moins spécifique à java, vous pouvez google pour Public Key Infrastructure - [wikipedia a un bon article] (https://en.wikipedia.org/wiki/Public_key_infrastructure). Pour normatif (document très technique et ennuyeux), jetez un coup d'œil à la [RFC 5280] (https://tools.ietf.org/html/rfc5280) –