java - BouncyCaSTLe 需要读取 ecdsa-sha2-nistp256 类型的 key

标签 java scala jar bouncycastle sshj

我正在开发一个使用 sshj (0.19.1) 进行 SSH2 连接的 scala 应用程序。我可以从 eclipse 中正常连接,但是从 fat jar 运行应用程序时,我遇到了一些错误。我最初的错误是:

Line 3: TransportException: null
 at net.schmizz.sshj.transport.TransportException$1.chain(33)
 at net.schmizz.sshj.transport.TransportException$1.chain(27)
 at net.schmizz.concurrent.Promise.deliverError(96)
 at net.schmizz.concurrent.Event.deliverError(74)
 at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(34)
 at net.schmizz.sshj.transport.KeyExchanger.notifyError(386)
 at net.schmizz.sshj.transport.TransportImpl.die(596)
 at net.schmizz.sshj.transport.Reader.run(68)

我已将 US_export_policy.jar 和 local_policy.jar 添加到 $JAVA_HOME/lib/security。我添加了以下内容来尝试将 bouncycaSTLe 注册为提供商,

import org.bouncycastle.jce.provider.BouncyCastleProvider
val bouncyCastle = new BouncyCastleProvider()
java.security.Security.addProvider(bouncyCastle)
net.schmizz.sshj.common.SecurityUtils.registerSecurityProvider("org.bouncycastle.jce.provider.BouncyCastleProvider")

但我仍然收到以下错误:

INFO  n.schmizz.sshj.common.SecurityUtils - Registration of Security Provider 'org.bouncycastle.jce.provider.BouncyCastleProvider' unexpectedly failed
INFO  n.schmizz.sshj.common.SecurityUtils - BouncyCastle not registered, using the default JCE provider
INFO  n.s.sshj.transport.random.JCERandom - Creating new SecureRandom.
WARN  net.schmizz.sshj.DefaultConfig - Illegal key size
WARN  net.schmizz.sshj.DefaultConfig - Cannot find any provider supporting Twofish/CBC/NoPadding
...
WARN  net.schmizz.sshj.DefaultConfig - Illegal key size or default parameters
WARN  net.schmizz.sshj.DefaultConfig - Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy
INFO  n.s.sshj.transport.TransportImpl - Client identity string: SSH-2.0-SSHJ_0.19.1
INFO  n.s.sshj.transport.TransportImpl - Server identity string: SSH-2.0-OpenSSH_6.6.1
ERROR n.s.sshj.transport.TransportImpl - Dying because - {}
net.schmizz.sshj.common.SSHRuntimeException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256
    at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:431)
    at net.schmizz.sshj.transport.kex.AbstractDHG.next(AbstractDHG.java:66)
    at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:358)
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:493)
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:104)
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:172)
    at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
Caused by: java.security.GeneralSecurityException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256
    at net.schmizz.sshj.common.KeyType$3.readPubKeyFromBuffer(KeyType.java:120)
    at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:429)
    ... 6 common frames omitted
INFO  n.s.sshj.transport.TransportImpl - Disconnected - UNKNOWN
ERROR net.schmizz.concurrent.Promise - <<kex done>> woke to: net.schmizz.sshj.transport.TransportException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256

我正在将 jar 运行为 java -cp ../lib/bcprov-jdk15on-1.51.jar -jar <my jar> ,因为据我了解,您不能将 bouncycaSTLe 作为提供程序包含在您的 fat jar 中。但我不确定我错过了什么,因为我无法将其注册为提供商。任何帮助将不胜感激。

最佳答案

java -jar 忽略来自命令行或环境变量的类路径,并使用指定的 jar 及其 list 中的任何 class-path 项。要么

  • 在 jar 的 list 中引用 bcprov(但不要将像 bcprov 这样的提供程序合并到您自己的 jar 中,您是正确的)或

  • 将 bcprov 放入 JRE/lib/ext 中,以便 JVM 无需使用类路径即可找到它。

或者使用 java -cp myjar:bcprov mainclassname (Windows 上的 ;)运行,它确实使用类路径。

我希望您的 new BouncyCaSTLeProvider() 在到达尝试使用提供程序的代码点之前抛出,但我不了解 scala,也许这里有所不同。

FWIW,如果这个项目升级到 5 年前(Java 7),您就不需要 EC 的 Bouncy,包括 ECDSA。对于 Twofish,您仍然需要它,但我不知道谁(其他)实现了 Twofish,如果有人需要它,我会感到惊讶;您的服务器此处标识为 OpenSSH,但事实并非如此。

关于java - BouncyCaSTLe 需要读取 ecdsa-sha2-nistp256 类型的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971678/

相关文章:

scala - 如何对集合元素的字段求和而不先映射它们(如 foldLeft/reduceLeft)?

java - 创建 JAR 文件并执行它时出错

java - SQL 开发人员 : How do I increase the 'SQL Array Fetch Size' greater than the max. 500?

java - Java 8 日期时间的单一模式

mongodb - Play Framework 2.1 的最佳 mongodb 驱动程序

java - 返回时间(分钟)

scala - 在 Scala 中的对象之间共享变量

java - 将一个jar文件添加到另一个jar文件中

java - 如何使用选项检查标签是否已选中

java - 是否可以使用 @Spy 表示法在 Mockito 中声明但不能实例化一个 spy 对象?