bouncycastle错误“JCE无法使用jar-with-dependencies”对提供程序BC进行身份validation
我正在创建一个使用bouncycastle的java独立应用程序 。 一切都在日蚀中起作用。 我正在创建一个具有 这种 依赖关系的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