使用phpseclib和sha256与服务器的SFTP连接

使用phpseclib和sha256与服务器的SFTP连接,php,redhat,openssh,phpseclib,rsa-sha256,Php,Redhat,Openssh,Phpseclib,Rsa Sha256,我必须连接到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服务器。我首先使用了以下代码:

$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
如有必要,我可以在服务器端发送调试日志。此服务器使用密码、kexalgorithm和MACs参数的默认值

谢谢你的帮助。

引用:

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

  string    "ssh-rsa"
  mpint     e
  mpint     n
这里的“e”和“n”参数构成签名密钥blob

使用此密钥格式进行签名和验证是根据 在[RFC3447]中使用SHA-1散列将RSASSA-PKCS1-v1_5方案发送到

因此,将哈希值设置为sha256可能会破坏某些内容。由于SSH不支持(phpseclib的默认设置),所以甚至没有使用MGF哈希

也就是说,我确实认为您找到了一个phpseclib可以使用改进的领域——它没有将hash设置为sha1。应该这样

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


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

我已经做了几项测试,为我要连接的服务器的kexalgorithmsMAcs编码了不同的值。它按照我希望的那样工作


非常感谢Neubert的帮助和为解决这个问题所花费的时间。

非常感谢您的快速回答。我可以访问该服务器,命令“sshd-T”告诉我,rsa-sha2-256在hostkeyalgorithms参数的返回值列表中。这是否意味着phpseclib和libssh2都不允许从php脚本连接到SSH或SFTP服务器,除非使用sha1?@Schonke-我不知道libssh2,但是对于phpseclib,耶,情况似乎就是这样。但是正如我所说的,我将尝试提出一个实现该特性的请求(我将在本周末尝试完成这项工作)。但是,我的请求不会让您告诉它sha1/sha256。相反,我的拉取请求将自动执行sha256(如果可用),而sha1(否则)。这就是我所理解的。很高兴你能处理这个案子。我希望它能帮助其他人。@Schonke-最新的git版本2.0应该像前面讨论的那样使用sha256/sha512!执行此操作的提交:(提交位于1.0分支中,但它被合并并更新以与2.0和主分支一起使用)