问题描述
客户通过 Putty 使用 SFTP 命令发送的密钥工作正常。通过 Winscp 工作正常。
但是当我尝试使用 Java 代码时,我得到以下信息:
Caused by: com.maverick.ssh.SshException:
Failed to negotiate a transport component
[hmac-sha1,hmac-md5] [hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256]
[UnkNown cause]
代码:
else if (authMethod == AUTH_KEY) {
PublicKeyAuthentication pk = new PublicKeyAuthentication();
SshPrivateKeyFile pkfile = SshPrivateKeyFileFactory.parse(new FileInputStream(pass));
com.maverick.ssh.components.SshKeyPair pair;
if (pkfile.isPassphraseProtected())
pair = pkfile.toKeyPair(keypass);
else
pair = pkfile.toKeyPair(null);
pk.setPrivateKey(pair.getPrivateKey());
pk.setPublicKey(pair.getPublicKey());
this.session.authenticate(pk);
上述通用代码适用于现有密钥,不适用于这个新服务器。没有找到代码级别的具体解决方案。
解决方法
问题是你方只提供 HMAC-MD5 和 HMAC-SHA-1 作为 MAC 算法,而服务器端只支持 HMAC-SHA-256 和 HMAC-SHA-512。服务器在这里做正确的事情,因为 MD5 和 SHA-1 被认为是不安全的,即使它们的 HMAC 版本在 SSH 中使用时不是不安全的,责任方已经放弃使用 MD5 和 SHA-1。
因为您和服务器无法就使用的算法达成一致,连接无法继续。
看起来 the latest version of the Maverick SSH client 支持 hmac-sha2-256
(HMAC-SHA-256),因此您可以尝试升级,或者您可以使用更现代的 SSH 库。