[英]How to tell if phpseclib sftp response is a challenge with a password request when key doesn't match
最近有人无意中将用于我的 ssh/sftp 的密钥文件更改为远程服务器。 当我尝试从命令行通过 ssh 连接到服务器时,我推断出这一点,并且我收到了密码请求的挑战,这表明密钥不再被识别。
如何让我的 php 程序检测到意外的密码挑战? 目前我有这个:
$sftp = new SFTP(self::DOMAIN_NAME);
$Key = new RSA();
$private_rsa_key = file_get_contents('/home/ddfs/.ssh/' . self::KEY_FILE);
$Key->loadKey($private_rsa_key);
$rc = $sftp->login(self::USER, $Key);
$errors = $sftp->getSFTPErrors();
目前我看到 $rc 设置为 FALSE 并且 $errors 是一个空数组。
SSH 发起的密码更改请求
SSH 有一个内置的密码重置机制。 我对RFC4252 § 8 的阅读意味着 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 数据包应该只在响应“密码”SSH_MSG_USERAUTH_REQUEST 时发送,但谁知道 OpenSSH 开发人员如何解释 RFC 的该部分。
由于您正在进行公钥身份验证,phpseclib 将发送一个“公钥” SSH_MSG_USERAUTH_REQUEST 所以看起来 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 不会是一个有效的响应,但同样,谁知道呢。
如果服务器确实以 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 数据包响应,那么您可以执行$sftp->getErrors()
(而不是getSFTPErrors
)并查找以SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:
开头的数据包。 甚至可以做$sftp->getLastError()
。
getSFTPErrors
返回 SFTP 层的错误 - 而不是 SSH2 层。 SFTP 作为协议不知道身份验证 - 这完全由 SSH 层处理。 IE。 您要查看的不是 SFTP 错误,而是 SSH 错误。
参考代码: https : //github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/SSH2.php#L2219
其他可能的密码请求机制
密码请求可能不是来自 SSH 的内置身份验证机制。 您可能会从“公钥”SSH_MSG_USERAUTH_REQUEST 获得 SSH_MSG_USERAUTH_SUCCESS 响应。
在这一点上,我可以看到两种可能性:
它可能是您看到的横幅消息。 您可以通过执行$sftp->getBannerMessage()
来获得这些。
当您通过 SSH 进入服务器而不是 SFTP 进入服务器时,您可能只会看到此错误。 IE。 除非您$ssh->exec()
或$ssh->write()
否则您可能看不到错误。 此时,“错误”可以通过 stderr 或 stdout 传达给您。
要确定我必须查看 SSH 日志。 phpseclib 日志可能足够也可能不够。 我的意思是你可以做$sftp->exec('pwd');
或$sftp->read('[prompt]');
但我的猜测是你还没有这样做。 如果你想走那条路,你可以define('NET_SSH2_LOGGING', 2);
然后在执行$sftp->exec()
或$sftp->read()
后echo $sftp->getLog()
$sftp->read()
。
PuTTY 日志可能更有用。 要获取它们,您可以转到 PuTTY->Session->Logging,选中“SSH 数据包”单选按钮,然后照常连接。
不幸的是,据我所知,OpenSSH 不会记录原始/解密的 SSH2 数据包,因此 OpenSSH 在这里不会太有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.