Я должен подключиться к серверу 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.
Спасибо за помощь.
Я сделал несколько тестов, кодируя разные значения для kexalgorithms а также MACS на sshd_config сервера, к которому я хочу подключиться. И это работает, как я хотел, чтобы это работало.
большое спасибо Нойберт за вашу помощь и за время, которое вам пришлось потратить, чтобы решить эту проблему.
квотирование 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, но я могу рассмотреть возможность добавления поддержки для этого в ближайшие несколько дней и отправки запроса на удаление …