2017-09-27 4 views
1

Récemment quelqu'un a changé par inadvertance le fichier de clés utilisé pour mon ssh/sftp vers un serveur distant. Je l'ai déduit quand j'ai essayé de me connecter au serveur depuis la ligne de commande et j'ai été confronté à une demande de mot de passe, qui indiquait que la clé n'était plus reconnue.Comment savoir si la réponse de phpseclib sftp est un problème avec une demande de mot de passe lorsque la clé ne correspond pas

Comment faire pour que mon programme php détecte un problème de mot de passe inattendu? Actuellement j'ai ceci:

$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(); 

Au moment où je vois $ rc est mis à FAUX et $ erreurs est un tableau vide.

Répondre

1

SSH changement de mot de passe initié demande

SSH dispose d'un mécanisme intégré pour réinitialisations de mot de passe. Ma lecture de RFC4252 § 8 implique que les paquets SSH_MSG_USERAUTH_PASSWD_CHANGEREQ devraient seulement être envoyés en réponse à un "mot de passe" SSH_MSG_USERAUTH_REQUEST mais qui sait comment les développeurs d'OpenSSH ont interprété cette section de la RFC. Comme vous faites l'authentification par clé publique, phpseclib enverra une "clé publique" SSH_MSG_USERAUTH_REQUEST, donc il semblerait que SSH_MSG_USERAUTH_PASSWD_CHANGEREQ ne soit pas une réponse valide, mais encore une fois, qui sait.

Si le serveur ne répond avec un paquet de SSH_MSG_USERAUTH_PASSWD_CHANGEREQ que vous pourriez faire $sftp->getErrors() (au lieu de getSFTPErrors) et chercher un qui commence par SSH_MSG_USERAUTH_PASSWD_CHANGEREQ:. Peut-être même faire $sftp->getLastError(). Renvoie des erreurs avec la couche SFTP - et non avec la couche SSH2. SFTP en tant que protocole ne connaît pas l'authentification - c'est entièrement géré par la couche SSH. c'est à dire. ce ne sont pas les erreurs SFTP que vous voulez regarder mais les erreurs SSH.

Code de référence: https://github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/SSH2.php#L2219

D'autres mécanismes possibles de demande de mot de passe

Il est possible que la demande de mot de passe ne vient pas de mécanisme d'authentification intégré de SSH. Il est possible que vous obteniez une réponse SSH_MSG_USERAUTH_SUCCESS à partir de la "clé publique" SSH_MSG_USERAUTH_REQUEST.

A ce stade, je vois deux possibilités:

  1. Il pourrait être un message bannière que vous voyez. Vous pouvez les obtenir en faisant $sftp->getBannerMessage().

  2. Il est possible que vous ne voyiez cette erreur que lorsque vous utilisez SSH sur le serveur plutôt que SFTP. c'est à dire. il est possible que vous ne voyiez pas l'erreur sauf si vous avez fait $ssh->exec() ou $ssh->write(). À ce stade, l '"erreur" pourrait vous être communiquée via stderr ou stdout.

Pour être sûr que je devrais voir les journaux SSH. Les journaux de phpseclib peuvent être insuffisants ou non. Je veux dire que vous pourriez faire $sftp->exec('pwd'); ou $sftp->read('[prompt]'); mais je suppose que vous ne le faites pas déjà. Si vous voulez suivre cette route, vous pouvez faire define('NET_SSH2_LOGGING', 2); puis echo $sftp->getLog() après avoir fait $sftp->exec() ou $sftp->read().

Les journaux PuTTY pourraient être plus utiles. Pour les obtenir, vous pouvez aller à PuTTY-> Session-> Logging, cocher la case d'option "SSH paquets", puis se connecter comme d'habitude. Malheureusement, OpenSSH ne connait pas, à ma connaissance, les paquets SSH2 bruts/décryptés, donc OpenSSH ne va pas être trop utile ici.

+0

Merci. J'ai ajouté '$ errors = $ sftp-> getErrors(); $ last_error = $ sftp-> getLastError(); 'mais les deux sont vides après la tentative de connexion échouée. –

+0

@NickWeavers - J'ai mis à jour ma réponse. En particulier, faites attention à la deuxième section car il semble que votre serveur n'utilise pas SSH_MSG_USERAUTH_PASSWD_CHANGEREQ. – neubert