2016-11-04 2 views
1

Я использую phpseclib и я пытаюсь войти в систему с помощью ключа RSA:Войти с ключом RSA в phpseclib терпит неудачу (раз уходит)

$ssh = new SSH2('<server_domain_name>'); 
$key = new RSA(); 
$key->load(file_get_contents('<private_key_path>')); 
if($ssh->login('root',$key)){ 
    echo "Logged In!!!"; 
} else { 
    echo "Login failed!"; 
} 

но Логин не удается! Заглядывая в класс SSH2, я вижу, что вход в систему с ключом RSA происходит в функции _login_helper() (правильно, если я ошибаюсь), который вызывается функцией _login(), вызываемой функцией login() (при обстоятельствах).

Логин() -> _login() -> _login_helper()

Но этот кусок кода:

if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { 
    if (!$this->_connect()) { 
     return false; 
    } 
} 

в _login() функция всегда возвращает ложь и таким образом, исполнение никогда не достигает _login_helper(). Причина выше части кода возвращающейся фальши значение по умолчанию этих переменных/констант:

var $bitmap = 0; 
const MASK_CONNECTED  = 0x00000002; 

Я немного разочарован. Я что-то упускаю?

EDIT: Я забыл упомянуть, что логин возвращается/не работает через несколько секунд. Добавляя несколько ECHO в методе _connect(), я вижу, что метод истекает во время ожидания данных сервера. Во время выполнения этого цикла:

while (!feof($this->fsock) && !preg_match('#(.*)^(SSH-(\d\.\d+).*)#ms', $data, $matches)) 

сервера выходов только одну строку: «SSH-2.0-OpenSSH_4.3», а затем (во второй раз, цикл выполняется), то раз здесь:

if ([email protected]_select($read, $write, $except, $sec, $usec) && !count($read)) { 

EDIT 2: SSH-журналы стороны, что я пытаюсь подключиться сказать:

Соединение закрыто THE_SSH_SERVER_IP
4 ноября 23:09:58 web1 SSHD [10316]: не получил Опознавательный cation string fromTHE_ WEB_SERVER_IP

+0

Какими бы полезными были журналы SSH. Вы можете получить их, выполнив 'define ('NET_SSH2_LOGGING', 2)' вверху, а затем 'echo $ ssh-> getLog()' после неудачного входа. Вместо этого ... кто знает. Возможно, PHP не может читать ваш закрытый ключ из-за разрешений. Возможно, ваш закрытый ключ не соответствует открытому ключу в файлах ~/.ssh/authorized_keys для пользователя, которого вы пытаетесь войти в систему. – neubert

+0

getLog() возвращает пустую строку. Ключ можно прочитать с помощью file_get_contents, и я могу успешно использовать его через консоль. На самом деле, если я использую ssh2_auth_pubkey_file() с этим ключом, он отлично работает. Если функция, которая делает аутентификацию RSA, действительно является _privatekey_login(), то значения $ bitmask и MASK_CONNECTED никогда не позволят коду получить в этой точке. –

ответ

1

phpseclib считывает идентификационную строку сервера сервера перед отправкой ее собственной. Это то, что делает PuTTY. В качестве доказательства этого здесь в лог-файл выборки из замазки, когда я пытался подключиться к локальной машине: 4022:

Event Log: Writing new session log (SSH packets mode) to file: putty.log 
Event Log: Looking up host "127.0.0.1" 
Event Log: Connecting to 127.0.0.1 port 4022 
Event Log: Server version: SSH-2.0-OpenSSH_6.6p1 Ubuntu-2ubuntu1 
Event Log: Using SSH protocol version 2 
Event Log: We claim version: SSH-2.0-PuTTY_Release_0.63 

Вот что говорят SSH спецификации:

When the connection has been established, both sides MUST send an 
    identification string. This identification string MUST be 

     SSH-protoversion-softwareversion SP comments CR LF 

Источник: https://tools.ietf.org/html/rfc4253#section-4.2

Обратите внимание, что он не говорит, что одна сторона должна отправить перед другой стороной. Обе стороны должны иметь доступный контент для извлечения немедленно. Если ваш SSH-сервер только собирается условно сделать контент доступным для извлечения после того, как клиент отправил свою идентификационную строку, ваш сервер SSH будет ошибкой. Дайте мне знать, какой сервер вы используете. Я открою отчет об ошибке.

В то же время здесь модифицированная версия phpseclib, которая посылает строку идентификации первого вместо прочтения первых:

https://github.com/terrafrost/phpseclib/tree/send-identifier-first

Позвольте мне знать, если это работает для вас.И дайте мне знать, что вы используете в качестве своего сервера.

+0

Как я уже писал выше, SSH-сервер «OpenSSH_4.3». O.S - Ubuntu 14.04. –

+1

Это сработало! Благодаря! Хм! Это ошибка сервера OpenSSH? –

+0

Насколько я помню, это была установка по умолчанию SSH-сервера, которую я выбрал во время установки ubuntu. –