在 Tomcat 中运行时出现 NoClassDefFoundError PKCS8EncodedKeySpec

问题描述

我在版本 com.hieronymus:sshj 中使用 0.31.0 在 Spring Boot 应用程序和数据交换服务器之间建立 ssh 连接。为了验证应用程序,使用了一个私有 SSH 密钥,由 ssh-keygen认设置生成,没有密码保护。它以pem格式作为文件存储在本地文件系统中。

以下代码用于处理身份验证:

override fun authenticate(ssh: SSHClient) {
    val keys = ssh.loadKeys(
        String(
            resourceLoader.getResource("/path/to/key").inputStream.readBytes()
        ),String(
            resourceLoader.getResource("/path/to/key.pub").inputStream.readBytes()
        ),null
    )
    ssh.authPublickey(username,keys)
}

当我从 IntelliJ 或 fat jar 运行应用程序时,一切正常。但是,当我将它打包为一个 war 文件并将其部署到运行在 JDK 11 上的 Tomcat 9 服务器时,问题开始出现,我也用它来开发它:

java.lang.NoClassDefFoundError: java/security/spec/PKCS8EncodedKeySpec
        at org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePrivate(UnkNown Source) ~[bcprov-jdk15on-1.68.jar:1.68.0]
        at java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:384) ~[na:na]
        at com.hierynomus.sshj.userauth.keyprovider.OpenSSHkeyv1KeyFile.readUnencrypted(OpenSSHkeyv1KeyFile.java:223) ~[sshj-0.31.0.jar:0.31.0]
        at com.hierynomus.sshj.userauth.keyprovider.OpenSSHkeyv1KeyFile.readDecodedKeyPair(OpenSSHkeyv1KeyFile.java:113) ~[sshj-0.31.0.jar:0.31.0]
        at com.hierynomus.sshj.userauth.keyprovider.OpenSSHkeyv1KeyFile.readKeyPair(OpenSSHkeyv1KeyFile.java:85) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.keyprovider.BaseFileKeyProvider.getPublic(BaseFileKeyProvider.java:81) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.method.KeyedAuthMethod.putPubKey(KeyedAuthMethod.java:45) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.method.AuthPublickey.buildreq(AuthPublickey.java:62) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.method.AuthPublickey.buildreq(AuthPublickey.java:81) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.method.AbstractAuthMethod.request(AbstractAuthMethod.java:68) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.userauth.UserAuthImpl.authenticate(UserAuthImpl.java:73) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.SSHClient.auth(SSHClient.java:221) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:342) ~[sshj-0.31.0.jar:0.31.0]
        at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:360) ~[sshj-0.31.0.jar:0.31.0]
        at SSHClass.authenticate(SSHClass.kt:4711) ~[classes/:0.0.1-SNAPSHOT]

这确实让我大吃一惊,因为 PKCS8EncodedKeySpec 是“java 核心”的一部分。库显然能够解析文件,但在创建关键对象时失败。

Tomcat 是否会以某种方式阻止已部署的应用程序解析私有 SSH 密钥?我是否需要将密钥放在某个密钥库中并从那里加载它们?有人遇到过这个问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)