2017-05-09 41 views
2

私はcrypto/certsの新機能で、Bouncy Castleライブラリを使用して証明書を生成しようとしています。そのサンプルコードのいくつかを見てみると、これは私がこれまで持っているものです。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)); 
    } 
} 

私のポンポンは、様々な弾む城のLIBSと最新の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> 

しかし、私はこのエラーを取得しています:

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 

誰に知っていますか?

答えて

3

異なるバージョンが使用されているために発生します(1.56および1.46)。バージョン1.47以降、many parts of the API have changed

私は唯一のバージョン1.56を使用するために私のpom.xmlを変え、あなたのコードを実行できます。

<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> 

あなたの質問にコードを実行するには、LIBSの最小セットです。もちろん、アプリケーションで他のライブラリ(bcpgbcprov-extなど)を使用する必要がある場合は、それらを含めることができます(ただし、これらの混合バージョンの問題を避けるため、バージョン> = 1.55を選択することをお勧めします)

注: bcmailはそう実際にのみ bcmailがpom.xml

+0

意図的ではなかった雅で必要とされる、bcpkixbcprovに依存します。私は実際にこの暗号空間について多くのことを知りませんし、異なるSOの投稿を見ると、このサンプルコードを実行するための他のライブラリがあったことさえ知りませんでした。 opensslを使用する場合のように、Javaを使用して証明書、キーを作成するための暗号チュートリアルをお勧めしますか? (これは理解するのに便利だと思っていましたが、keytoolのjavaコードのinstdにある場合のみ:https://sites.google.com/site/ddmwsst/create-your-own-certificate-and-ca) – Crystal

+0

証明書私は** bcprov **と** bcmail **が(答えにあるように)十分であると信じていますが、私は** bcpg **、** bcprov-ext **などを使う必要は一度もありませんでした。 。チュートリアル:私は[Javaセキュリティガイド](http://docs.oracle.com/javase/8/docs/technotes/guides/security)、特に**公開鍵インフラストラクチャ**の章をお勧めします。 Bouncycastleには[doc page](http://www.bouncycastle.org/documentation.html)もありますが、それは良いかもしれないと思います。 –

+0

概念的でJava固有ではないものについては、[公開キーインフラストラクチャ - [wikipediaには良い記事があります](https://en.wikipedia.org/wiki/Public_key_infrastructure)のgoogleを使用できます。規範的(非常に技術的で退屈な文書)については、[RFC 5280](https://tools.ietf.org/html/rfc5280) –

関連する問題