如何解决在 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 举报,一经查实,本站将立刻删除。