0

我必须连接到 SFTP 服务器。我首先使用了这段代码:

$Key = new RSA();
$Key->setPassword("password");
$Key->loadKey(file_get_contents('path_to_RSA_private_key'));
$sftp = new SFTP($IP_addr, $port_number);
if (!$sftp->login('username', $Key))
  echo date('Y/m/d H:i:s').' SFTP login failed to $IP_addr';

它运作良好。我知道 phpseclib 使用默认的 sha1,我想使用 sha256。所以我尝试使用该代码:

$Key = new RSA();
$Key->setHash('sha256');
$Key->setMGFHash('sha256');
$Key->setPassword("password");
$Key->loadKey(file_get_contents('path_to_RSA_private_key'));
$sftp = new SFTP($IP_addr, $port_number);
if (!$sftp->login('username', $Key))
  echo date('Y/m/d H:i:s').' SFTP login failed to $IP_addr';

但它不起作用。我在服务器上收到了这条消息:

error: key_verify: invalid format

如有必要,我可以在服务器端发送调试日志。此服务器使用密码、KexAlgorithms 和 MACs 参数的默认值。

感谢帮助。

4

2 回答 2

1

我通过在要连接的服务器的sshd_config上为kexalgorithmsMAcs编码不同的值进行了几次测试。它可以按照我的意愿工作。

非常感谢Neubert的帮助以及您为解决该问题所花费的时间。

于 2018-05-31T07:34:56.587 回答
0

引用RFC4253

“ssh-rsa”密钥格式具有以下特定编码:

  string    "ssh-rsa"
  mpint     e
  mpint     n

这里的 'e' 和 'n' 参数形成签名密钥 blob。

使用此密钥格式的签名和验证是根据 [RFC3447] 中的 RSASSA-PKCS1-v1_5 方案使用 SHA-1 哈希执行的。

所以你将哈希设置为 sha256 可能会破坏事情。甚至没有使用 MGF 哈希,因为 SSH 不支持PSS 签名(这是 phpseclib 默认的)。

也就是说,我确实认为您已经找到了 phpseclib 可以使用改进的领域——它将SSH 的签名方案设置为 PKCS1,但没有将哈希设置为 sha1。应该的。

此外,FWIW、RFC8332描述了使用 SHA-256 进行签名。但是这个签名仍然使用 RSASSA-PKCS1-v1_5。仅仅因为存在 RFC 并不意味着您的服务器支持它。您可以通过执行print_r($ssh->getServerHostKeyAlgorithms())然后查看是否rsa-sha2-256在返回的列表中来检查它是否存在。

phpseclib 目前不支持 RFC8332,但我可以考虑在接下来的几天内添加对它的支持并提交拉取请求......

于 2018-05-23T12:55:08.970 回答