Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java bouncycastle,NoSuchMethodError(org.bouncycastle.asn1.ASN1Integer)_Java_Maven_Cryptography_Bouncycastle - Fatal编程技术网

Java bouncycastle,NoSuchMethodError(org.bouncycastle.asn1.ASN1Integer)

Java bouncycastle,NoSuchMethodError(org.bouncycastle.asn1.ASN1Integer),java,maven,cryptography,bouncycastle,Java,Maven,Cryptography,Bouncycastle,我完全不熟悉加密/证书,并尝试使用Bouncy Castle库生成证书。看看他们的一些示例代码,到目前为止,我已经掌握了以下内容: package crypto; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x509.BasicConstraints; import org.bouncycastle.asn1.x509.Extension; import org.bouncycastle.as

我完全不熟悉加密/证书,并尝试使用Bouncy Castle库生成证书。看看他们的一些示例代码,到目前为止,我已经掌握了以下内容:

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));
    }
}
我的pom有各种Bouncy Castle LIB和最新的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>

org.bouncycastle
bcprov-jdk15on
1.56
org.bouncycastle
bcpkix-jdk15on
1.47
org.bouncycastle
bcmail-jdk15
1.46
org.bouncycastle
bcprov-ext-jdk15on
1.55
org.bouncycastle
bcpg-jdk15on
1.56
org.bouncycastle
bcprov-debug-jdk15on
1.55
共用配置
共用配置
1.7
com.itextpdf
itextpdf
5.5.11
但我得到了一个错误:

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
线程“main”java.lang.NoSuchMethodError中的异常:org.bouncycastle.asn1.ASN1Integer。(I)V 位于org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder.CreatePSParams(未知源) 位于org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder。(未知来源) 位于org.bouncycastle.operator.jcajce.JcaContentSignerBuilder。(未知来源) 位于crypto.App.buildRootCert(App.java:62) 位于crypto.App.main(App.java:34) 进程已完成,退出代码为1
有人知道为什么吗

这是因为使用了不同的版本(1.56和1.46)。在版本1.47之后

我可以运行您的代码,将我的
pom.xml
更改为仅使用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>

org.bouncycastle
bcprov-jdk15on
1.56
org.bouncycastle
bcmail-jdk15on
1.56
这是运行问题中代码的最小lib集。当然,如果您的应用程序需要使用其他lib(bcpgbcprov ext等等),您可以相应地包含它们(但我建议您选择版本>=1.55,以避免这些混合版本问题)


注意:bcmail依赖于bcpkixbcprov,因此实际上在
pom.xml

中只需要bcmail,这不是有意的。我真的不太了解这个加密空间,看了不同的文章,我甚至不知道还有其他lib可以让这个示例代码工作。您是否推荐使用Java创建证书的加密教程,就像使用openssl一样。(我认为理解这一点很有用,但只有在java代码中而不是在keytool:)对于证书创建/操作,我相信bcprov和bcmail就足够了(正如答案中所示),我从未需要使用bcpg、bcprov ext和其他工具。教程:我建议,特别是公钥基础设施章节。Bouncycastle也有一个功能,但我认为它可能会更好。对于一些概念性更强、不太特定于java的东西,你可以在谷歌上搜索公钥基础设施-。对于规范性(非常技术性和枯燥的文档),请查看