Hi all, I found a workaround for my problem. Version 1.78.1 of the bouncy castle bundles have fixed the Import-Package entries in the manifest.
So I downloaded bcpkix-jdk18on-1.78.1.jar and bcutil-jdk18on-1.78.1.jar und edited their manifests, so that they appear as version 1.78.0. I removed the two problematic 1.78.0 bundles with bundle:uninstall bcpkix-jdk18on bcutil-jdk18on Then I deployed the repackaged jar files manually in Karaf. Everything seems to be working now with that workaround. Best Regards -- Jan Schulze ________________________________________ Von: Schulze, Jan <jan.schu...@uni-tuebingen.de> Gesendet: Mittwoch, 13. November 2024 00:50:58 An: user@karaf.apache.org Betreff: camel-karaf 4.8.1: Feature camel-ssh breaks Karaf SSH Shell Hi, first of all, many thanks for the new releases of camel-karaf supporting Camel 4 and congratulations on the good work. I am currently moving a project from Karaf 4.4.3/Camel 3.x to Karaf 4.4.6/Camel 4.8.1 and noticed the following problem, that is hard to reproduce: After installing the feature camel-ssh, it is *sometimes* no longer possible to log into the Karaf shell via ssh. In that case, I get the following exception: --- 2024-11-12 20:08:17,219 | WARN | rverSessionImpl | 48 | pache.sshd.osgi | resolveAvailableSignaturesProposal(ServerSessionImpl[null@/134.2.44.70:49706]) failed (NoClassDefFoundError) to get key types: org/bouncycastle/util/io/pem/PemReader java.lang.NoClassDefFoundError: org/bouncycastle/util/io/pem/PemReader at org.apache.karaf.shell.ssh.keygenerator.KeyPairLoader.getKeyPair(KeyPairLoader.java:74) ~[?:?] at org.apache.karaf.shell.ssh.keygenerator.OpenSSHKeyPairProvider.loadKeys(OpenSSHKeyPairProvider.java:83) ~[?:?] at org.apache.sshd.common.keyprovider.KeyPairProvider.getKeyTypes(KeyPairProvider.java:139) ~[!/:2.12.1] at org.apache.sshd.server.session.AbstractServerSession.resolveAvailableSignaturesProposal(AbstractServerSession.java:385) ~[!/:2.12.1] at org.apache.sshd.common.session.helpers.SessionHelper.resolveAvailableSignaturesProposal(SessionHelper.java:959) ~[!/:2.12.1] at org.apache.sshd.common.session.helpers.SessionHelper.getKexProposal(SessionHelper.java:984) ~[!/:2.12.1] at org.apache.sshd.common.session.helpers.AbstractSession.sendKexInit(AbstractSession.java:2654) ~[!/:2.12.1] at org.apache.sshd.server.session.AbstractServerSession.readIdentification(AbstractServerSession.java:510) ~[!/:2.12.1] at org.apache.sshd.common.session.helpers.AbstractSession.messageReceived(AbstractSession.java:499) ~[!/:2.12.1] at org.apache.sshd.common.session.helpers.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:64) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.handleReadCycleCompletion(Nio2Session.java:409) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:382) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:377) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.lambda$completed$0(Nio2CompletionHandler.java:38) ~[!/:2.12.1] at java.security.AccessController.doPrivileged(AccessController.java:318) [?:?] at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.completed(Nio2CompletionHandler.java:37) ~[!/:2.12.1] at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129) ~[?:?] at sun.nio.ch.Invoker.invokeDirect(Invoker.java:160) ~[?:?] at sun.nio.ch.UnixAsynchronousSocketChannelImpl.implRead(UnixAsynchronousSocketChannelImpl.java:573) ~[?:?] at sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:276) ~[?:?] at sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:297) ~[?:?] at org.apache.sshd.common.io.nio2.Nio2Session.doReadCycle(Nio2Session.java:494) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.doReadCycle(Nio2Session.java:372) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.startReading(Nio2Session.java:365) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.startReading(Nio2Session.java:361) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.startReading(Nio2Session.java:357) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.startReading(Nio2Session.java:353) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Session.startReading(Nio2Session.java:349) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Acceptor$AcceptCompletionHandler.onCompleted(Nio2Acceptor.java:308) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2Acceptor$AcceptCompletionHandler.onCompleted(Nio2Acceptor.java:263) ~[!/:2.12.1] at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.lambda$completed$0(Nio2CompletionHandler.java:38) ~[!/:2.12.1] at java.security.AccessController.doPrivileged(AccessController.java:318) [?:?] at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.completed(Nio2CompletionHandler.java:37) [!/:2.12.1] at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129) [?:?] at sun.nio.ch.Invoker$2.run(Invoker.java:221) [?:?] at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?] at java.lang.Thread.run(Thread.java:840) [?:?] Caused by: java.lang.ClassNotFoundException: org.bouncycastle.util.io.pem.PemReader not found by bcpkix-jdk18on [215] ... 39 more --- I think, the problem is caused by two different versions of the bundle bcpkix: bundle:list -t 0 | grep bcpkix 20 x Active x 30 x 1.77 x bcpkix 222 x Active x 80 x 1.78.0 x bcpkix-jdk18on The bundle bcpkix 1.77 is included in Karaf. When installing the feature camel-ssh, the bundle bcpkix-jdk18on 1.78.0 is added. The bundle bcpkix 1.77 is importing org.bouncycastle.util.io.pem (from bundle bcprov 1.77.0). The bundle bcpkix-jdk18on 1.78.0 is NOT importing org.bouncycastle.util.io.pem: package:imports| grep pem org.bouncycastle.util.io.pem x [1.72.0,) x x 20 x bcpkix org.bouncycastle.util.io.pem x [1.77.0,2.0.0) x x 46 x org.apache.karaf.shell.ssh As mentioned at https://github.com/bcgit/bc-java/issues/1621, the bundle bcpkix-jdk18on 1.78.0 is missing multiple Import-Package entries from it's manifest. However, as seen above, the Karaf Shell uses any version of org.bouncycastle.util.io.pem in the version range [1.77.0,2.0.0): Because both bcpkix 1.77.0 and bcpkix-jdk18on 1.78.0 are within that version range, it seems to be random, which bundle is used. When bcpkix 1.77.0 is picked up, connecting to the Karaf Shell is possible. When bcpkix-jdk18on 1.78.0 is picked up, the exception listed above is thrown. I hope, I was able to make it clear, what I mean. Is there any way to force the Karaf Shell (org.apache.karaf.shell.ssh) to use bcpkix 1.77 every time? Or is there any other workaround? I would be grateful for any help. Thanks -- Jan Schulze