Java bouncycastle错误“;JCE无法验证提供程序BC“;加上;“带依赖项的jar”;
我正在创建一个java独立应用程序,它使用bouncycastle。一切都在eclipse中工作。我正在创建一个具有类似依赖项的jar 当我使用java-jar myapp-0.0.1-SNAPSHOT-jar-with-dependencies.jar运行应用程序时, 我得到以下错误:Java bouncycastle错误“;JCE无法验证提供程序BC“;加上;“带依赖项的jar”;,java,bouncycastle,executable-jar,Java,Bouncycastle,Executable Jar,我正在创建一个java独立应用程序,它使用bouncycastle。一切都在eclipse中工作。我正在创建一个具有类似依赖项的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
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);
}
}
有什么想法吗?
谢谢。不幸的是,JCE需要对带有Bouncy Castle的JAR进行签名,而创建可执行JAR会破坏它。准备单独装运BouncyCastle罐
实际上,您可以使用SpringBoot或类似的东西——它将jar嵌入胖jar中,然后解压缩并加载这些jar。或者类似Spring Boot的东西。Bouncycastle罐子必须签名,不能放在胖罐子里。 您可以单独发货,并为此使用maven shade插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<artifactSet>
<excludes>
<exclude>org.bouncycastle:*:*:*</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.example.Main</Main-Class>
<Class-Path>. ./lib/bcprov-jdk16-1.46.jar</Class-Path>
</manifestEntries>
</transformer>
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>fat</shadedClassifierName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven阴影插件
2.3
org.bouncycastle:**:*
com.example.Main
. ./lib/bcprov-jdk16-1.46.jar
真的
脂肪
包裹
阴凉处
在ManifestResourceTransformer中,为bouncycastle jar依赖项定义类路径。问题在于bouncycastle jar已签名,必须保持原样。对我来说,包括Maven中的依赖项,其作用域为“提供的”
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.55</version>
<scope>provided</scope>
</dependency>
org.bouncycastle
bcprov-jdk15on
1.55
假如
我用这个插件包装了一个胖罐子
它使用了很好的阴影,并且在一个大罐子里使用了有弹性的城堡好吧,这就是我的想法。。。你知道有没有办法让maven assembly插件和BC jar分开发货?谢谢。你可以使用SpringBoot或者类似的东西——它将罐子嵌入胖罐子,然后解包并处理它们。或者类似于Spring Boot的东西。这似乎确实是个问题。单独装运似乎对我们有效。你能解释一下这些条目在解决这个问题上有什么作用吗?类路径条目是否会将fat jar链接到bouncy castle jar?是的,指定的bouncy castle jar类将由classloader加载,并可在运行时使用。classpath manifest属性将指向bouncy castle提供程序依赖项。这是一个很好的答案,不过这需要用户手动获取jar,因为maven默认情况下不会在包上复制jar。Maven可以使用
Maven dependency plugin
为我们将JAR导出到目标文件夹。示例可在以下网址找到:是否有人可以详细说明这到底是做什么的,以及如何对其进行定制以与特定的应用程序配合使用?例如,类路径应该是什么,用什么来代替这些星号?恐怕我对Java这一领域太陌生了,无法掌握所有这些背后的逻辑和含义。@Sargon1您可能可以将其作为常规maven项目使用。类路径相对于项目根(pom.xml所在的位置)。让*保持原样。这将排除所有bouncy castle LIB。如果您想排除特定的LIB,请查看这里有此问题并保存了一天