bouncycastle错误“JCE无法使用jar-with-dependencies”对提供程序BC进行身份validation

我正在创建一个使用bouncycastlejava独立应用程序 一切都在日蚀中起作用。 我正在创建一个具有 这种 依赖关系jar

当我使用“java -jar myapp-0.0.1-SNAPSHOT-jar-with-dependencies.jar”运行应用程序时。

我收到以下错误:

java.io.IOException: exception encrypting data - java.lang.SecurityException: JCE cannot authenticate the provider BC 

我的代码:

  Security.addProvider(new BouncyCastleProvider()); String keystoreDirectory = "C:/myapp/security"; File file = new File(keystoreDirectory + "/" + PRIVATE_KEY_FILE); if (!file.isFile()) { try { Configuration idOrganization = configurationBoundary.find(Configuration.ID_ORGANIZATION); KeyStore store = KeyStore.getInstance("PKCS12", SECURITY_PROVIDER); char[] password = KEY.toCharArray(); store.load(null, password); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", SECURITY_PROVIDER); keyPairGenerator.initialize(2048); KeyPair pair = keyPairGenerator.generateKeyPair(); X500Name issuer = new X500Name("CN=" + idOrganization.getProperty()); BigInteger serial = BigInteger.valueOf(new SecureRandom().nextLong()); Date notBefore = new Date(System.currentTimeMillis() - 10000); Date notAfter = new Date(System.currentTimeMillis() + 24L * 3600 * 1000 * 365); X500Name subject = new X500Name("CN=" + idOrganization.getProperty()); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(pair.getPublic().getEncoded()); X509v3CertificateBuilder builder = new X509v3CertificateBuilder(issuer, serial, notBefore, notAfter, subject, publicKeyInfo); ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(SECURITY_PROVIDER).build(pair.getPrivate()); X509Certificate cert = new JcaX509CertificateConverter().setProvider(SECURITY_PROVIDER).getCertificate(builder.build(sigGen)); store.setKeyEntry(idOrganization.getProperty(), pair.getPrivate(), null, new java.security.cert.Certificate[]{cert}); try (FileOutputStream fos = new FileOutputStream(file)) { store.store(fos, password); //Error here } } catch (Exception ex) { logger.error("Keystore creation error", ex); } } 

有任何想法吗 ? 谢谢。

Bouncycastle jar必须签名,不能放在胖jar里面。 您可以单独发货并使用maven-shade-plugin:

   org.apache.maven.plugins maven-shade-plugin 2.3    org.bouncycastle:*:*:*      com.example.Main . ./lib/bcprov-jdk16-1.46.jar    true fat    package  shade     

在ManifestResourceTransformer中,您可以为bouncycastle jar依赖项定义类路径。

不幸的是,JCE要求JAR与Bouncy Castle签名并创建可执行jar破坏它。 准备单独运送BouncyCastlejar。

你实际上可以使用Spring Boot或类似的东西 – 它将jar嵌入fat jar,然后解压缩并加载它们。 或类似Spring Boot的东西。

我用这个插件包装了一个胖jar子

https://github.com/nthuemmel/executable-packer-maven-plugin

它使用了很好的阴影并在一个肥胖的jar子里使用了充气城堡

问题是BouncyCastle jar已签名,必须保持原样。 对我来说,包括Maven中的依赖关系,范围为“提供”工作。

   org.bouncycastle bcprov-jdk15on 1.55 provided