Apache mina-sshd ssh 客户端始终打印不支持的 EdDSA 提供程序

问题描述

我正在使用 Apache sshd 的 ssh 客户端。每当我建立到目标 ssh 服务器的连接时,我都会在日志中看到这一点。连接正常,但有什么问题吗?我该如何解决

异常看起来像:

(SshException) to process: EdDSA provider not supported

解决方法

如何修复

要解决此问题,请添加依赖项 net.i2p.crypto:eddsa。充气城堡不提供 EdDSA 的实现。例如在 maven 中添加此依赖项:

   <dependency>
       <groupId>net.i2p.crypto</groupId>
       <artifactId>eddsa</artifactId>
       <version>0.3.0</version>
   </dependency>

不修复的影响

如果您不解决此问题,您将无法验证主机密钥。我的测试没有受到影响,因为我还没有验证主机密钥。但是,一旦部署到生产环境,我就会受到影响,因为必须验证主机密钥。

详情

在 Apache mina-sshd 源代码中,类 SecurityUtils 揭示了问题。该类将 EdDSA 的提供程序硬编码为 EdDSASecurityProviderRegistrar :

public static final List<String> DEFAULT_SECURITY_PROVIDER_REGISTRARS = Collections.unmodifiableList(
        Arrays.asList(
                "org.apache.sshd.common.util.security.bouncycastle.BouncyCastleSecurityProviderRegistrar","org.apache.sshd.common.util.security.eddsa.EdDSASecurityProviderRegistrar"));

查看 EdDSASecurityProviderRegistrar 您会看到它期望类 net.i2p.crypto.eddsa.EdDSAKey 存在:

@Override
public boolean isSupported() {
    Boolean supported;
    synchronized (supportHolder) {
        supported = supportHolder.get();
        if (supported != null) {
            return supported.booleanValue();
        }

        ClassLoader cl = ThreadUtils.resolveDefaultClassLoader(getClass());
        supported = ReflectionUtils.isClassAvailable(cl,"net.i2p.crypto.eddsa.EdDSAKey");
        supportHolder.set(supported);
    }

    return supported.booleanValue();
}

在谷歌上进行快速搜索,您会看到 net.i2p.crypto.eddsa.EdDSAKey 由库 net.i2p.crypto:eddsa 提供。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...