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?
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
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. –
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) –