Libgit2:SSH:无法交换加密密钥

Libgit2 : SSH : Unable to exchange encryption keys

背景

我正在编写一个基于 Linux 的应用程序 (gtkmm),它使用托管在 github 上的单个私有存储库。该应用程序正在使用 Libgit2SSH Authentication。 SSH 密钥是在外部创建的,在通过终端测试时工作正常。

我目前有两个很可能相关的问题。

问题 1:无法交换加密密钥。

尝试克隆私有存储库时出现此问题;并且是从 Libgit2 打印的错误。 我尝试使用 git_cred_ssh_key_newgit_cred_ssh_key_from_agent 但没有成功。

问题 2:从未调用凭据回调。

我已确保已为克隆选项、获取选项和远程回调设置了此(Credential 回调); git_clone() 正在使用。 里面有一个永远不会打印的 cout;与 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

(评论人数不足,所以希望这有帮助)

此错误通常意味着在设置 SSH 通道时存在协议级问题,这就是您无法发送凭据的原因(认为密码协商失败)。

了解 libssh2 使用的加密后端(我怀疑它是 OpenSSL)以及它的版本和后端版本会很有帮助。 请注意,libssh2 最近才获得对现在事实上的安全方法的支持(因此它在终端中工作的原因:您的客户端具有与服务器相同的受支持密码)。