Libgit2: SSH: невозможно обменяться ключами шифрования - PullRequest
0 голосов
/ 08 мая 2018

Фон

Я пишу приложение для Linux (gtkmm), которое использует один частный репозиторий, размещенный на github. Приложение использует Libgit2 и SSH Authentication. Ключи SSH были созданы извне и отлично работают при тестировании через терминал.

В настоящее время у меня есть две проблемы, которые, скорее всего, коррелируют.

Проблема 1: невозможно использовать ключи шифрования Exchange.

Эта проблема возникает при попытке клонировать частный репозиторий; и это ошибка, напечатанная из Libgit2. Я пытался использовать git_cred_ssh_key_new И git_cred_ssh_key_from_agent безуспешно.

Проблема 2: обратный вызов учетных данных никогда не вызывается.

Я гарантировал, что этот (Credential обратный вызов) был установлен для опций клонирования, опций извлечения и удаленных обратных вызовов; и используется git_clone(). Внутри находится кут, который никогда не печатается; как текст, связанный с GUI, который также не задан; поэтому я определил, что это никогда не вызывается.

int repoManager_gitCredentialCallback(git_cred **out, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload){
cout << "Credentials Called" << endl;
string temp_publicKey = Global::programHomeDir + "/id_rsa.pub";
string temp_privateKey = Global::programHomeDir + "/id_rsa";
return git_cred_ssh_key_new( out, username_from_url, temp_publicKey.c_str(), temp_privateKey.c_str(), "" );
} // END - gitCredentialCallback

В функции для клонирования:

// SET GIT OPTIONS:
git_clone_options repoManager_cloneOptions = GIT_CLONE_OPTIONS_INIT;
git_fetch_options repoManager_fetchOptions = GIT_FETCH_OPTIONS_INIT;
//  git_remote_callbacks repoManager_remoteCallbacks = GIT_REMOTE_CALLBACKS_INIT;

repoManager_cloneOptions.fetch_opts.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_cloneOptions.fetch_opts.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_cloneOptions.fetch_opts.callbacks.payload = this;
repoManager_cloneOptions.remote_cb = repoManager_gitRemoteCallback;

//  repoManager_remoteCallbacks.credentials = repoManager_gitCredentialCallback;
//  repoManager_cloneOptions.fetch_opts = repoManager_fetchOptions;

repoManager_fetchOptions.callbacks.transfer_progress = repoManager_fetchProgress;
repoManager_fetchOptions.callbacks.credentials = repoManager_gitCredentialCallback;
repoManager_fetchOptions.callbacks.payload = this;
repoManager_fetchOptions.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;


if(git_clone(&repoManager_repo, repoManager_RepoURL, Global::launcherRepositoryDir.c_str(), &repoManager_cloneOptions) < 0){
    RepoManager_thread_taskFailed("Failed to Clone the repository.", "FAIL: Clone failed.");
    return;
} // END - Git Clone

1 Ответ

0 голосов
/ 16 мая 2018

(Недостаточно повторений для комментариев, поэтому , надеюсь , это полезно)

Эта ошибка обычно означает, что при настройке канала SSH возникает проблема на уровне протокола, поэтому вы не можете отправить учетные данные (например, ошибка согласования шифра).

Было бы полезно узнать, какой крипто-бэкэнд использует libssh2 (я подозреваю, что это OpenSSL), а также его версию и бэкэнд-версию. Обратите внимание, что libssh2 только недавно получил поддержку чего-то, что теперь является де-факто безопасным методом (следовательно, почему он работает в терминале: ваш клиент имеет поддерживаемый общий шифр с сервером).

...