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