SFTP-соединение с сервером с использованием phpseclib и 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 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

При необходимости я могу отправить отладочные сообщения на стороне сервера. Этот сервер использует значения по умолчанию для параметров Ciphers, KexAlgorithms и MAC.

Спасибо за помощь.

0

Решение

Я сделал несколько тестов, кодируя разные значения для kexalgorithms а также MACS на sshd_config сервера, к которому я хочу подключиться. И это работает, как я хотел, чтобы это работало.

большое спасибо Нойберт за вашу помощь и за время, которое вам пришлось потратить, чтобы решить эту проблему.

1

Другие решения

квотирование RFC4253:

Формат ключа «ssh-rsa» имеет следующую специфическую кодировку:

  string    "ssh-rsa"mpint     e
mpint     n

Здесь параметры ‘e’ и ‘n’ образуют блок ключа подписи.

Подписание и проверка с использованием этого ключевого формата выполняется согласно
к схеме RSASSA-PKCS1-v1_5 в [RFC3447] с использованием хэша SHA-1.

Таким образом, ваша установка хэша для sha256, вероятно, сломает вещи. А хэш MGF даже не используется, так как SSH не поддерживает Подписи PSS (это то, что phpseclib по умолчанию).

Тем не менее, я думаю, что вы попали в область, где phpseclib может использовать улучшения — это устанавливает схему подписи для SSH на PKCS1 но он не устанавливает хэш sha1. Это должно.

Кроме того, FWIW, RFC8332 описывает подписание с SHA-256. Но эта подпись все еще использует RSASSA-PKCS1-v1_5. И только то, что RFC существует, не означает, что ваш сервер его поддерживает. Вы можете проверить, если он делает, делая print_r($ssh->getServerHostKeyAlgorithms()) а потом посмотрим, если rsa-sha2-256 находится в списке, который возвращается.

phpseclib в настоящее время не поддерживает RFC8332, но я могу рассмотреть возможность добавления поддержки для этого в ближайшие несколько дней и отправки запроса на удаление …

0

По вопросам рекламы [email protected]