Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème lors du handshake d'une connexion SSH...

entre un client en php et un serveur en C++

Sujet résolu
    27 avril 2015 à 18:56:54

    Bonjour,

    Je réalise un travail où un serveur apache qui agit comme un client doit se connecter à un serveur c++, via une connexion SSH, sur un port personalisé (disons 4242). Pour des besoins de développement tout se fait en local (donc Client et Serveur sur la même IP).

           Cient <---------SSH----------> Server

    (server apache)                             C++


    Malheureusement, actuellement je n'arrive pas à faire ce que je souhaite.

    Ce qui fonctionne :

    - La connexion sur le port 22, sans SSH.

    - La connexion entre un autre Client en C++ et le server, via SSH.

    Ce qui ne fonctionne pas :

    - La connexion sur le port 4242, via SSH. Quand je regarde mes logs, je vois que le client essaie de se connecter au server mais le server n'arrive pas à faire le handshake et je ne sais pas pourquoi.

    Du côté du client, j'utilise la fonction php ssh2_connect() et je sais que ça "plante" avant même de vérifier l'empreinte du server et sa clé publique. Un bout de code pour être plus clair :

            $mysshconnection = new mySSH();
            $mysshconnection -> connect();
    
    
    class mySSH {
                private $ssh_host = "127.0.0.1";
                private $ssh_port = 4242;
                private $ssh_server_fp = '01:9D:53:3A:C7:12:DB:39:CA:B3:81:AF:49:B3:17:96';
                private $ssh_auth_user = 'Noflair';
                private $ssh_auth_pub = '/etc/apache2/ssl/ssl-cert-snakeoil.pub_key';
                private $ssh_auth_priv = '/etc/apache2/ssl/ssl-cert-snakeoil.key';
                private $ssh_auth_pass;
                private $connection;
              
                public function connect() {
                    if (!($this->connection = ssh2_connect($this->ssh_host,$this->ssh_port))) {
                        throw new Exception('Cannot connect to server');
                    }
                    $fingerprint = ssh2_fingerprint($this->connection, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
                    if (strcmp($this->ssh_server_fp, $fingerprint) !== 0) {
                        throw new Exception('Unable to verify server identity!');
                    }
                    if (!ssh2_auth_pubkey_file($this->connection,$this->ssh_auth_user,$this->ssh_auth_pub,$this->ssh_auth_priv,$this->ssh_auth_pass)) {
                        throw new Exception('Autentication rejected by server');
                    }
                }


    Du côté server, j'utilise la bibliothèque Boost:asio et plus précisément ce code : http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/ssl/server.cpp

    J'ai du coup plusieurs questions assez naïves relatives à mes explications :

    - Même si je pense que le problème est dans le domaine de la programmation réseau est-ce que je poste vraiment dans la bonne section ? :p

    - Est-ce que je peux véritablement passer par un port tierce comme dans l'exemple avec 4242 ? (j'ai essayé en faisant écouter mon serveur sur le port 443 mais bind m'interdit de faire cela).

    - L'erreur exacte qui est produite a le code asio.ssl:336027900 . J'ai cherché sur le net pour résoudre celle-ci mais rien de satisfaisant :-(

    - J'ai cherché des exemples et des réponses sur le net mais je n'ai rien trouvé. Si vous avez des liens/références claires et précises sur le sujet je suis intéressé.

    Merci pour vos lumières !

    Noflair

    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2015 à 10:23:20

      Tu fais bien écouter ton serveur SSH sur le port 4242 ?
      • Partager sur Facebook
      • Partager sur Twitter
      System test engineer
        28 avril 2015 à 13:48:07

        En effet.

        EDIT : la réponse ci-après était bien la cause. C'est tellement bête :p ...

        Pour ceux que ça intéresse, la partie php pour se connecter à un serveur via SSL peut être réalisé grâce à fsockopen.

        Un exemple simple :

        		$fp = fsockopen("ssl://127.0.0.1", 4242, $errno, $errstr);
        		if (!$fp)
        		{
        			echo "$errstr ($errno)<br />\n";
        		}
        		else
        		{
        			$out = "Hello server distant !\n";
        			fwrite($fp, $out);
        			fclose($fp);
        		}



        -
        Edité par noflair 4 mai 2015 à 14:36:23

        • Partager sur Facebook
        • Partager sur Twitter
          28 avril 2015 à 14:05:23

          C'est peut-être con (je ne connais pas du tout les librairies et de manière générale, la prog n'est pas mon fort), mais pour moi tu es en train d'essayer de faire communiquer un client SSH avec un serveur SSL... donc ça ne marche pas.
          • Partager sur Facebook
          • Partager sur Twitter
          System test engineer

          Problème lors du handshake d'une connexion SSH...

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown