Я создаю проект, в котором есть зависимости (также созданные мной), которые сами зависят от Bouncy Castle, который включает файлы сигнатур для его jar, и если они присутствуют в затененном jar, JVM видит, что jar не действителен для этих подписей и отказывается его запускать:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:340)
at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:282)
at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:320)
at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:232)
at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:760)
at java.base/java.util.jar.JarFile.getInputStream(JarFile.java:856)
at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:848)
at java.base/jdk.internal.loader.Resource.cachedInputStream(Resource.java:77)
at java.base/jdk.internal.loader.Resource.getByteBuffer(Resource.java:163)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:853)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:534)
at java.base/java.lang.Class.forName(Class.java:513)
at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:797)
at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:692)
Единственное решение, которое я нашел, — это исключить файлы подписей из окончательного jar-файла. Это отлично работает в OpenJDK JRE, но Oracle JRE требует, чтобы поставщики безопасности (такие как Bouncy Castle) были подписаны, поэтому исключение файлов подписи приводит к
java.lang.SecurityException: JCE cannot authenticate the provider BC
at java.base/javax.crypto.JceSecurity.getInstance(JceSecurity.java:150)
at java.base/javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:280)
at ... (my dependency's classes)
Caused by: java.util.jar.JarException: The JCE Provider file:/app/simple-usecase-0.0.6.jar is not signed.
at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:440) ~[?:?]
at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:319) ~[?:?]
at javax.crypto.JarVerifier.verify(JarVerifier.java:263) ~[?:?]
at javax.crypto.ProviderVerifier.verify(ProviderVerifier.java:130) ~[?:?]
at javax.crypto.JceSecurity.verifyProvider(JceSecurity.java:196) ~[?:?]
at javax.crypto.JceSecurity$2.apply(JceSecurity.java:222) ~[?:?]
at javax.crypto.JceSecurity$2.apply(JceSecurity.java:211) ~[?:?]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[?:?]
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:211) ~[?:?]
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:146) ~[?:?]
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:280) ~[?:?]
at ... (my dependency's classes again)
каждый раз, когда он вызывается из кода.
Мне нужно скомпилировать его в один jar-файл, который может работать на следующей JRE (из Oracle):
java 21.0.3 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 21.0.3+7-LTS-152)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.3+7-LTS-152, mixed mode, sharing)
Я пробовал использовать плагин Maven Shade и исключить файлы подписи:
org.apache.maven.plugins
maven-shade-plugin
3.5.3
package
shade
false
true
${java.io.tmpdir}/dependency-reduced-pom.xml
com.acme.coyote
hidden.coyote
Main
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
Я также пробовал использовать одиночную сборку Maven:
org.apache.maven.plugins
maven-assembly-plugin
3.7.1
Main
jar-with-dependencies
make-assembly
package
single
Оба вышеперечисленных варианта работают с OpenJDK, но не с Oracle.
В качестве последнего ресурса я также попробовал исключить все Bouncy Castle. зависимости из затененного jar, добавив это в конфигурацию Maven Shade:
org.bouncycastle
а затем вручную добавил банки Bouncy Castle с помощью -cp, но загрузчик классов их не нашел. (Как и ожидалось, на OpenJDK это также не удалось)
Есть ли способ решить эту проблему?
Я компилирую OpenJDK 21 для целевой версии 21, а это конкретные зависимости Bouncy Castle (это не непосредственно в моем проекте, а в одной из его зависимостей):
org.bouncycastle
bcprov-jdk18on
1.78.1
org.bouncycastle
bcutil-jdk18on
1.78.1
org.bouncycastle
bcpkix-jdk18on
1.78.1
Подробнее здесь: https://stackoverflow.com/questions/786 ... can-run-on
Создайте один jar-файл для проекта с зависимостями Bouncy Castle, который может работать на Oracle JRE. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сканирование Prisma openjdk17, проблема CVE-2022-45146 Bouncy Castle 1.0.2.3 1.0.2.4
Anonymous » » в форуме JAVA - 0 Ответы
- 45 Просмотры
-
Последнее сообщение Anonymous
-
Мобильная версия